W7Connection.php 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  6. // +----------------------------------------------------------------------
  7. // | Author: liu21st <liu21st@gmail.com>
  8. // +----------------------------------------------------------------------
  9. namespace think\oracle;
  10. use PDO;
  11. use think\Container;
  12. use think\Db;
  13. use think\db\Connection as BaseConnection;
  14. use think\db\exception\BindParamException;
  15. use think\db\exception\DataNotFoundException;
  16. use think\db\exception\ModelNotFoundException;
  17. use think\db\Query;
  18. use think\exception\DbException;
  19. use think\exception\PDOException;
  20. use think\Model;
  21. /**
  22. * Oracle数据库驱动
  23. */
  24. class W7Connection extends BaseConnection
  25. {
  26. protected $builderClassName = '\\think\\oracle\\Builder';
  27. /**
  28. * 解析pdo连接的dsn信息
  29. * @access protected
  30. * @param array $config 连接信息
  31. * @return string
  32. */
  33. protected function parseDsn($config)
  34. {
  35. $dsn = 'oci:dbname=';
  36. if (!empty($config['hostname'])) {
  37. // Oracle Instant Client
  38. $dsn .= '//' . $config['hostname'] . ($config['hostport'] ? ':' . $config['hostport'] : '') . '/';
  39. }
  40. $dsn .= $config['database'];
  41. if (!empty($config['charset'])) {
  42. $dsn .= ';charset=' . $config['charset'];
  43. }
  44. return $dsn;
  45. }
  46. /**
  47. * 取得数据表的字段信息
  48. * @access public
  49. * @param string $tableName
  50. * @return array
  51. */
  52. public function getFields($tableName)
  53. {
  54. $this->initConnect(true);
  55. list($tableName) = explode(' ', $tableName);
  56. $sql = "select a.column_name,data_type,DECODE (nullable, 'Y', 0, 1) notnull,data_default, DECODE (A .column_name,b.column_name,1,0) pk from all_tab_columns a,(select column_name from all_constraints c, all_cons_columns col where c.constraint_name = col.constraint_name and c.constraint_type = 'P' and c.table_name = '" . strtoupper($tableName) . "' ) b where table_name = '" . strtoupper($tableName) . "' and a.column_name = b.column_name (+)";
  57. $pdo = $this->linkID->query($sql);
  58. $result = $pdo->fetchAll(PDO::FETCH_ASSOC);
  59. $info = [];
  60. if ($result) {
  61. foreach ($result as $key => $val) {
  62. $val = array_change_key_case($val);
  63. $info[$val['column_name']] = [
  64. 'name' => $val['column_name'],
  65. 'type' => $val['data_type'],
  66. 'notnull' => $val['notnull'],
  67. 'default' => $val['data_default'],
  68. 'primary' => $val['pk'],
  69. 'autoinc' => $val['pk'],
  70. ];
  71. }
  72. }
  73. return $this->fieldCase($info);
  74. }
  75. /**
  76. * 取得数据库的表信息(暂时实现取得用户表信息)
  77. * @access public
  78. * @param string $dbName
  79. * @return array
  80. */
  81. public function getTables($dbName = '')
  82. {
  83. $pdo = $this->linkID->query("select table_name from all_tables");
  84. $result = $pdo->fetchAll(PDO::FETCH_ASSOC);
  85. $info = [];
  86. foreach ($result as $key => $val) {
  87. $info[$key] = current($val);
  88. }
  89. return $info;
  90. }
  91. /**
  92. * 获取最近插入的ID
  93. * @access public
  94. * @param string $sequence 自增序列名
  95. * @return string
  96. */
  97. public function getLastInsID($sequence = null)
  98. {
  99. return '';
  100. if(!$sequence){
  101. return '';
  102. }
  103. $pdo = $this->linkID->query("select {$sequence}.currval as id from dual");
  104. $result = $pdo->fetchColumn();
  105. return $result;
  106. }
  107. /**
  108. * SQL性能分析
  109. * @access protected
  110. * @param string $sql
  111. * @return array
  112. */
  113. protected function getExplain($sql)
  114. {
  115. return [];
  116. }
  117. protected function supportSavepoint()
  118. {
  119. return true;
  120. }
  121. /**
  122. * 插入记录
  123. * @access public
  124. * @param Query $query 查询对象
  125. * @param boolean $replace 是否replace
  126. * @param boolean $getLastInsID 返回自增主键
  127. * @param string $sequence 自增序列名
  128. * @return integer|string
  129. */
  130. public function insert(Query $query, $replace = false, $getLastInsID = false, $sequence = null)
  131. {
  132. // 分析查询表达式
  133. $options = $query->getOptions();
  134. // 生成SQL语句
  135. $sql = $this->builder->insert($query, $replace);
  136. $bind = $query->getBind();
  137. if (!empty($options['fetch_sql'])) {
  138. // 获取实际执行的SQL语句
  139. return $this->getRealSql($sql, $bind);
  140. }
  141. // 执行操作
  142. $result = '' == $sql ? 0 : $this->execute($sql, $bind, $query);
  143. if ($result) {
  144. $sequence = $sequence ?: (isset($options['sequence']) ? $options['sequence'] : 'SEQ_'.$options['table']);
  145. $lastInsId = $this->getLastInsID($sequence);
  146. $data = $options['data'];
  147. if ($lastInsId) {
  148. $pk = $query->getPk($options);
  149. if (is_string($pk)) {
  150. $data[$pk] = $lastInsId;
  151. }
  152. }
  153. $query->setOption('data', $data);
  154. $query->trigger('after_insert');
  155. if ($getLastInsID) {
  156. return $lastInsId;
  157. }
  158. }
  159. return $result;
  160. }
  161. /**
  162. * 得到某个列的数组
  163. * @access public
  164. * @param Query $query 查询对象
  165. * @param string $field 字段名 多个字段用逗号分隔
  166. * @param string $key 索引
  167. * @return array
  168. */
  169. public function column(Query $query, $field, $key = '')
  170. {
  171. $options = $query->getOptions();
  172. if (isset($options['field'])) {
  173. $query->removeOption('field');
  174. }
  175. if (is_null($field)) {
  176. $field = ['*'];
  177. } elseif (is_string($field)) {
  178. $field = array_map('trim', explode(',', $field));
  179. }
  180. if ($key && ['*'] != $field) {
  181. array_unshift($field, $key);
  182. $field = array_unique($field);
  183. }
  184. $query->setOption('field', $field);
  185. if (empty($options['fetch_sql']) && !empty($options['cache'])) {
  186. // 判断查询缓存
  187. $cache = $options['cache'];
  188. $result = $this->getCacheData($query, $cache, null, $guid);
  189. if (false !== $result) {
  190. return $result;
  191. }
  192. }
  193. // 生成查询SQL
  194. $sql = $this->builder->select($query);
  195. // 还原field参数
  196. if (isset($options['field'])) {
  197. $query->setOption('field', $options['field']);
  198. } else {
  199. $query->removeOption('field');
  200. }
  201. $bind = $query->getBind();
  202. if (!empty($options['fetch_sql'])) {
  203. // 获取实际执行的SQL语句
  204. return $this->getRealSql($sql, $bind);
  205. }
  206. // 执行查询操作
  207. $pdo = $this->query($sql, $bind, $options['master'], true);
  208. if (1 == $pdo->columnCount()) {
  209. $result = $pdo->fetchAll(PDO::FETCH_COLUMN);
  210. } else {
  211. $resultSet = $pdo->fetchAll(PDO::FETCH_ASSOC);
  212. if (['*'] == $field && $key) {
  213. $result = array_column($resultSet, null, $key);
  214. } elseif ($resultSet) {
  215. $fields = array_keys($resultSet[0]);
  216. $count = count($fields);
  217. $key1 = array_shift($fields);
  218. $key2 = $fields ? array_shift($fields) : '';
  219. $key = $key ?: $key1;
  220. if (strpos($key, '.')) {
  221. list($alias, $key) = explode('.', $key);
  222. }
  223. if (2 == $count) {
  224. $column = $key2;
  225. } elseif (1 == $count) {
  226. $column = $key1;
  227. } else {
  228. $column = null;
  229. }
  230. $result = array_column($resultSet, $column, $key);
  231. } else {
  232. $result = [];
  233. }
  234. }
  235. $result = $this->formatColumnFieldType($field, $result);
  236. $result = $this->formatColumnField($field, $result);
  237. $result = $this->formatFieldUpper($result, $field);
  238. if (isset($cache) && isset($guid)) {
  239. // 缓存数据
  240. $this->cacheData($guid, $result, $cache);
  241. }
  242. return $result;
  243. }
  244. /**
  245. * 查找记录
  246. * @access public
  247. * @param Query $query 查询对象
  248. * @return array|\PDOStatement|string
  249. * @throws DbException
  250. * @throws ModelNotFoundException
  251. * @throws DataNotFoundException
  252. */
  253. public function select(Query $query)
  254. {
  255. // 分析查询表达式
  256. $options = $query->getOptions();
  257. if (empty($options['fetch_sql']) && !empty($options['cache'])) {
  258. $resultSet = $this->getCacheData($query, $options['cache'], null, $key);
  259. if (false !== $resultSet) {
  260. return $resultSet;
  261. }
  262. }
  263. // 生成查询SQL
  264. $sql = $this->builder->select($query);
  265. $query->removeOption('limit');
  266. $bind = $query->getBind();
  267. if (!empty($options['fetch_sql'])) {
  268. // 获取实际执行的SQL语句
  269. return $this->getRealSql($sql, $bind);
  270. }
  271. $resultSet = $query->trigger('before_select');
  272. if (!$resultSet) {
  273. // 执行查询操作
  274. $resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_pdo']);
  275. if ($resultSet instanceof \PDOStatement) {
  276. // 返回PDOStatement对象
  277. return $resultSet;
  278. }
  279. }
  280. $resultSet = $this->formatFieldUpper($resultSet, $options['field']);
  281. $resultSet = $this->formatColumnFieldType($options['field'], $resultSet);
  282. if (!empty($options['cache']) && false !== $resultSet) {
  283. // 缓存数据集
  284. $this->cacheData($key, $resultSet, $options['cache']);
  285. }
  286. return $resultSet;
  287. }
  288. /**
  289. * 获取缓存数据
  290. * @access protected
  291. * @param Query $query 查询对象
  292. * @param mixed $cache 缓存设置
  293. * @param array $options 缓存
  294. * @return mixed
  295. */
  296. protected function getCacheData(Query $query, $cache, $data, &$key = null)
  297. {
  298. // 判断查询缓存
  299. $key = is_string($cache['key']) ? $cache['key'] : $this->getCacheKey($query, $data);
  300. return Container::get('cache')->get($key);
  301. }
  302. /**
  303. * 执行查询 返回数据集
  304. * @access public
  305. * @param string $sql sql指令
  306. * @param array $bind 参数绑定
  307. * @param bool $master 是否在主服务器读操作
  308. * @param bool $pdo 是否返回PDO对象
  309. * @return array
  310. * @throws BindParamException
  311. * @throws \PDOException
  312. * @throws \Exception
  313. * @throws \Throwable
  314. */
  315. public function query($sql, $bind = [], $master = false, $pdo = false)
  316. {
  317. $this->initConnect($master);
  318. if (!$this->linkID) {
  319. return false;
  320. }
  321. // 记录SQL语句
  322. $this->queryStr = $sql;
  323. $this->bind = $bind;
  324. Db::$queryTimes++;
  325. try {
  326. // 调试开始
  327. $this->debug(true);
  328. // 预处理
  329. $this->PDOStatement = $this->linkID->prepare($sql);
  330. // 是否为存储过程调用
  331. $procedure = in_array(strtolower(substr(trim($sql), 0, 4)), ['call', 'exec']);
  332. // 参数绑定
  333. if ($procedure) {
  334. $this->bindParam($bind);
  335. } else {
  336. $this->bindValue($bind);
  337. }
  338. // 执行查询
  339. $this->PDOStatement->execute();
  340. // 调试结束
  341. $this->debug(false, '', $master);
  342. // 返回结果集
  343. return $this->getResult($pdo, $procedure);
  344. } catch (\PDOException $e) {
  345. if ($this->isBreak($e)) {
  346. return $this->close()->query($sql, $bind, $master, $pdo);
  347. }
  348. throw new PDOException($e, $this->config, $this->getLastsql());
  349. } catch (\Throwable $e) {
  350. if ($this->isBreak($e)) {
  351. return $this->close()->query($sql, $bind, $master, $pdo);
  352. }
  353. throw $e;
  354. } catch (\Exception $e) {
  355. if ($this->isBreak($e)) {
  356. return $this->close()->query($sql, $bind, $master, $pdo);
  357. }
  358. throw $e;
  359. }
  360. }
  361. /**
  362. * 查找单条记录
  363. * @access public
  364. * @param Query $query 查询对象
  365. * @return array|null|\PDOStatement|string
  366. * @throws DbException
  367. * @throws ModelNotFoundException
  368. * @throws DataNotFoundException
  369. */
  370. public function find(Query $query)
  371. {
  372. // 分析查询表达式
  373. $options = $query->getOptions();
  374. $pk = $query->getPk($options);
  375. $data = $options['data'];
  376. $query->setOption('limit', 1);
  377. if (empty($options['fetch_sql']) && !empty($options['cache'])) {
  378. // 判断查询缓存
  379. $cache = $options['cache'];
  380. if (is_string($cache['key'])) {
  381. $key = $cache['key'];
  382. } else {
  383. $key = $this->getCacheKey($query, $data);
  384. }
  385. $result = Container::get('cache')->get($key);
  386. if (false !== $result) {
  387. return $result;
  388. }
  389. }
  390. if (is_string($pk) && !is_array($data)) {
  391. if (isset($key) && strpos($key, '|')) {
  392. list($a, $val) = explode('|', $key);
  393. $item[$pk] = $val;
  394. } else {
  395. $item[$pk] = $data;
  396. }
  397. $data = $item;
  398. }
  399. $query->setOption('data', $data);
  400. // 生成查询SQL
  401. $sql = $this->builder->select($query);
  402. $query->removeOption('limit');
  403. $bind = $query->getBind();
  404. if (!empty($options['fetch_sql'])) {
  405. // 获取实际执行的SQL语句
  406. return $this->getRealSql($sql, $bind);
  407. }
  408. // 事件回调
  409. $result = $query->trigger('before_find');
  410. if (!$result) {
  411. // 执行查询
  412. $resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_pdo']);
  413. if ($resultSet instanceof \PDOStatement) {
  414. // 返回PDOStatement对象
  415. return $resultSet;
  416. }
  417. $result = isset($resultSet[0]) ? $resultSet[0] : null;
  418. }
  419. if (isset($cache) && $result) {
  420. // 缓存数据
  421. $this->cacheData($key, $result, $cache);
  422. }
  423. return $this->formatFieldUpper($result, $options['field']);
  424. // return $result;
  425. }
  426. /**
  427. * 数据number类型转换
  428. * @param $column_field
  429. * @param $column
  430. * @return array|mixed
  431. */
  432. protected function formatColumnFieldType($column_field, $column)
  433. {
  434. // number类型字段配置
  435. $fields = [
  436. 'CSDD_DDZT' => 'integer',
  437. 'CSDDCS_DCSL' => 'integer',
  438. 'DDDM_PDM' => 'integer',
  439. 'DDDM_DM' => 'integer',
  440. 'DDDM_LX' => 'integer',
  441. 'LJTDD_DDZT' => 'integer',
  442. 'SYZYDD_DDZT' => 'integer',
  443. 'XDDD_DDZT' => 'integer',
  444. 'XDMS_DM' => 'integer',
  445. 'XDZL_DM' => 'integer',
  446. 'YDJL_LX' => 'integer',
  447. 'YDXX_YDLX' => 'integer',
  448. 'YDXX_YDZT' => 'integer',
  449. 'YJDDD_DDZT' => 'integer',
  450. 'YPYSDD_DDZT' => 'integer',
  451. 'MZXX_HY' => 'integer',
  452. 'QYXX_YXBS' => 'integer',
  453. 'SYXX_ZT' => 'integer',
  454. 'SYXX_RYLX' => 'integer',
  455. 'SYXX_YXBS' => 'integer',
  456. 'CSLB_CSSJSJ' => 'integer',
  457. 'CSLB_CSSJZT' => 'integer',
  458. 'CSLB_LXJGSJ' => 'integer',
  459. 'CSLB_CJ' => 'integer',
  460. 'CSLB_PX' => 'integer',
  461. 'CSSJCS_SJXX' => 'integer',
  462. 'CSSJCS_SJSX' => 'integer',
  463. 'CSSJCS_SFXS' => 'integer',
  464. 'CSSJCS_PX' => 'integer',
  465. 'HKSJ_CSSJ' => 'integer',
  466. 'HKSJ_SJZT' => 'integer',
  467. 'HSJJD_HSRS' => 'integer',
  468. 'HSJJD_ZT' => 'integer',
  469. 'HSJJD_YXBS' => 'integer',
  470. 'JCBG_ZT' => 'integer',
  471. 'JCBG_YYX' => 'integer',
  472. 'JCBG_YXBS' => 'integer',
  473. 'JCBW_SXH' => 'integer',
  474. 'JCBW_ZT' => 'integer',
  475. 'JCBW_YXBS' => 'integer',
  476. 'JCMB_YXBS' => 'integer',
  477. 'JCMB_SXH' => 'integer',
  478. 'JCMB_MBLX' => 'integer',
  479. 'JCMBBW_SXH' => 'integer',
  480. 'JCXM_YXBS' => 'integer',
  481. 'JCXX_SFJJ' => 'integer',
  482. 'JCXX_ZT' => 'integer',
  483. 'JCXX_YXBS' => 'integer',
  484. 'JCXXXQ_YXBS' => 'integer',
  485. 'SRXX_SFJJ' => 'integer',
  486. 'SRXX_ZT' => 'integer',
  487. 'JYXM_ZBLX' => 'integer',
  488. 'JYXM_LX' => 'integer',
  489. 'JYXMMX_ZBLX' => 'integer',
  490. 'JYXX_YXBS' => 'integer',
  491. 'JYXXMX_TCLX' => 'integer',
  492. 'JYXXMX_JJ' => 'integer',
  493. 'JYXXMX_CQ' => 'integer',
  494. 'JYXXMX_ZT' => 'integer',
  495. 'JYXXMX_YXBS' => 'integer',
  496. 'JYYQ_ZT' => 'integer',
  497. 'JYYQ_LX' => 'integer',
  498. 'JYZB_PX' => 'integer',
  499. 'JYZB_LX' => 'integer',
  500. 'TBJL_LX' => 'integer',
  501. 'TC_LX' => 'integer',
  502. 'TC_ZT' => 'integer',
  503. 'TC_PX' => 'integer',
  504. 'TXM_ZT' => 'integer',
  505. 'MZJBXX_HY' => 'integer',
  506. 'MZJBXX_ZT' => 'integer',
  507. 'MZJBXX_YSBS' => 'integer',
  508. 'SPXX_DRLY' => 'integer',
  509. 'SPXX_RYLB' => 'integer',
  510. 'SPXX_DQJGLX' => 'integer',
  511. 'MZQYY_YXBS' => 'integer',
  512. 'MZSJL_YXBS' => 'integer',
  513. 'SHZD_YXBS' => 'integer',
  514. 'SQZD_YXBS' => 'integer',
  515. 'SSMC_SXH' => 'integer',
  516. 'SSMC_YXBS' => 'integer',
  517. 'SSMCYY_SSYY' => 'integer',
  518. 'SSMCYY_YXBS' => 'integer',
  519. 'SSQX_ZT' => 'integer',
  520. 'SSS_KKZSS' => 'integer',
  521. 'SSS_YKZSS' => 'integer',
  522. 'SSS_YXBS' => 'integer',
  523. 'SSXQ_YXBS' => 'integer',
  524. 'SSXQ_XXZT' => 'integer',
  525. 'id' => 'integer',
  526. 'TWMB_SBHTS' => 'integer',
  527. 'XXTZ_JGID' => 'integer',
  528. 'XXTZ_ZT' => 'integer',
  529. 'XXTZ_JJCD' => 'integer',
  530. 'KFXX_ZSKF' => 'integer',
  531. 'KFXX_ZT' => 'integer',
  532. 'WZCK_YXBS' => 'integer',
  533. 'WZCKMX_BZWZ' => 'integer',
  534. 'WZCKMX_WZCKSL' => 'integer',
  535. 'WZCKMX_YXBS' => 'integer',
  536. 'WZKC_BZWZ' => 'integer',
  537. 'WZKC_KCSL' => 'integer',
  538. 'WZKC_YXBS' => 'integer',
  539. 'WZPD_YXBS' => 'integer',
  540. 'WZPDMX_PDQSL' => 'integer',
  541. 'WZPDMX_PDHSL' => 'integer',
  542. 'WZPDMX_YXBS' => 'integer',
  543. 'WZRK_YXBS' => 'integer',
  544. 'WZRKMX_BZWZ' => 'integer',
  545. 'WZRKMX_WZRKSL' => 'integer',
  546. 'WZRKMX_YXBS' => 'integer',
  547. 'WZZD_BZWZ' => 'integer',
  548. 'WZZD_YXBS' => 'integer',
  549. 'BCXX_SXH' => 'integer',
  550. 'BCXX_ZT' => 'integer',
  551. 'BCXX_YXBS' => 'integer',
  552. 'BFXX_SXH' => 'integer',
  553. 'BFXX_YXBS' => 'integer',
  554. 'BISBJL_SBJGID' => 'integer',
  555. 'CSXX_SL' => 'integer',
  556. 'CSXX_ZT' => 'integer',
  557. 'CYXX_ZT' => 'integer',
  558. 'CYXX_YXBS' => 'integer',
  559. 'GDXX_ZT' => 'integer',
  560. 'GDXX_YXBS' => 'integer',
  561. 'HSXX_QZHS' => 'integer',
  562. 'HSXX_ZT' => 'integer',
  563. 'HSXX_YXBS' => 'integer',
  564. 'JGSJDW_ZT' => 'integer',
  565. 'JGXX_PZ_ZLK' => 'integer',
  566. 'JGXX_PZ_SYLBSXSJ' => 'integer',
  567. 'JGXX_ZT' => 'integer',
  568. 'JGXX_SFCSH' => 'integer',
  569. 'JGXX_JGMS' => 'integer',
  570. 'LSBL_YXBS' => 'integer',
  571. 'RWLX_SXH' => 'integer',
  572. 'SBQCZ_YXBS' => 'integer',
  573. 'SBQZD_LX' => 'integer',
  574. 'SBQZD_YXBS' => 'integer',
  575. 'SHXX_LX' => 'integer',
  576. 'SHXX_ZT' => 'integer',
  577. 'SHXX_YXBS' => 'integer',
  578. 'SJSBDZ_ZT' => 'integer',
  579. 'SJSBJL_LX' => 'integer',
  580. 'SPXX_YXBS' => 'integer',
  581. 'SSXX_ZT' => 'integer',
  582. 'SSXX_YXBS' => 'integer',
  583. 'SSXXXQ_YXBS' => 'integer',
  584. 'SSYYXQ_SSYL' => 'integer',
  585. 'SWXX_ZT' => 'integer',
  586. 'SWXX_YXBS' => 'integer',
  587. 'SYJBXX_DRLY' => 'integer',
  588. 'SYZLXX_RYLB' => 'integer',
  589. 'SYZLXX_DQJGLX' => 'integer',
  590. 'SYZLXX_YXBS' => 'integer',
  591. 'WQFDRWMB_XXL' => 'integer',
  592. 'WQFDRWMB_CBL' => 'integer',
  593. 'WQFDXX_YXBS' => 'integer',
  594. 'WQJSFA_XXL' => 'integer',
  595. 'WQJSFA_CBL' => 'integer',
  596. 'WQJSFA_SXH' => 'integer',
  597. 'WQJSXX_YXJ' => 'integer',
  598. 'WQJSXX_SXH' => 'integer',
  599. 'WQJSXX_YXBS' => 'integer',
  600. 'WQJSYPMB_BZYL' => 'integer',
  601. 'WQRWXX_LX' => 'integer',
  602. 'WQRWXX_LB' => 'integer',
  603. 'WQYPFA_BZYL' => 'integer',
  604. 'WQYPFA_SXH' => 'integer',
  605. 'YFXX_ZSYF' => 'integer',
  606. 'YFXX_ZT' => 'integer',
  607. 'YGXX_ID' => 'integer',
  608. 'YGXX_LX' => 'integer',
  609. 'YGXX_JSXH' => 'integer',
  610. 'YGXX_YXBS' => 'integer',
  611. 'YGXX_JCYG' => 'integer',
  612. 'YJDXX_SL' => 'integer',
  613. 'YJDXX_ZT' => 'integer',
  614. 'ZSXX_LX' => 'integer',
  615. 'ZSXX_ZT' => 'integer',
  616. 'ZSXX_CZ' => 'integer',
  617. 'ZSXX_PZ' => 'integer',
  618. 'ZSXX_PX' => 'integer',
  619. 'JSKCBZ_ZT' => 'integer',
  620. 'JSRKXQ_XXL' => 'integer',
  621. 'JSRKXQ_CBL' => 'integer',
  622. 'JSRKYPXQ_RKSL' => 'integer',
  623. 'JSSQXQ_XXL' => 'integer',
  624. 'JSSQXQ_CBL' => 'integer',
  625. 'JSSQYPXQ_RKSL' => 'integer',
  626. 'RKJL_HSXS' => 'integer',
  627. 'RKJL_RKSL' => 'integer',
  628. 'YPCK_ZT' => 'integer',
  629. 'YPCK_YXBS' => 'integer',
  630. 'YPCKMX_YPHSXS' => 'integer',
  631. 'YPCKMX_YPCKDWLX' => 'integer',
  632. 'YPCKMX_YPDCKSL' => 'integer',
  633. 'YPCKMX_YPCKSL' => 'integer',
  634. 'YPCKMX_YXBS' => 'integer',
  635. 'YPFF_YXBS' => 'integer',
  636. 'YPFFMX_YPHSXS' => 'integer',
  637. 'YPFFMX_YPFFDWLX' => 'integer',
  638. 'YPFFMX_YPFFSL' => 'integer',
  639. 'YPFFMX_YXBS' => 'integer',
  640. 'YPJSCK_YXBS' => 'integer',
  641. 'YPJSCKMX_JSCKSL' => 'integer',
  642. 'YPJSCKMX_YXBS' => 'integer',
  643. 'YPJSPD_YXBS' => 'integer',
  644. 'YPJSPDMX_PDQSL' => 'integer',
  645. 'YPJSPDMX_PDHSL' => 'integer',
  646. 'YPJSPDMX_YXBS' => 'integer',
  647. 'YPKC_DMYP' => 'integer',
  648. 'YPKC_HSXS' => 'integer',
  649. 'YPKC_KCSL' => 'integer',
  650. 'YPKC_YJZSX' => 'integer',
  651. 'YPKC_YJZXX' => 'integer',
  652. 'YPKC_KCLX' => 'integer',
  653. 'YPKC_YXBS' => 'integer',
  654. 'YPPD_YXBS' => 'integer',
  655. 'YPPDMX_PDQSL' => 'integer',
  656. 'YPPDMX_PDHSL' => 'integer',
  657. 'YPPDMX_YXBS' => 'integer',
  658. 'YPQL_ZT' => 'integer',
  659. 'YPQL_YXBS' => 'integer',
  660. 'YPQL_DDZT' => 'integer',
  661. 'YPQLMX_YPHSXS' => 'integer',
  662. 'YPQLMX_YPQLDWLX' => 'integer',
  663. 'YPQLMX_YPQLSL' => 'integer',
  664. 'YPQLMX_YPCKSL' => 'integer',
  665. 'YPQLMX_YPHYSL' => 'integer',
  666. 'YPQLMX_YXBS' => 'integer',
  667. 'YPRK_YXBS' => 'integer',
  668. 'YPRKMX_YPHSXS' => 'integer',
  669. 'YPRKMX_YPRKDWLX' => 'integer',
  670. 'YPRKMX_YPRKSL' => 'integer',
  671. 'YPRKMX_YXBS' => 'integer',
  672. 'YPSJSQ_LX' => 'integer',
  673. 'YPSJSQ_YXBS' => 'integer',
  674. 'YPSJSQMX_YPHSXS' => 'integer',
  675. 'YPSJSQMX_YPSJSQDWLX' => 'integer',
  676. 'YPSJSQMX_YPSJSQSL' => 'integer',
  677. 'YPSJSQMX_YXBS' => 'integer',
  678. 'YPZD_JSYC' => 'integer',
  679. 'YPZD_DMYP' => 'integer',
  680. 'YPZD_XY' => 'integer',
  681. 'YPZD_HSXS' => 'integer',
  682. 'YPZD_ZT' => 'integer',
  683. 'YPZD_PXH' => 'integer',
  684. 'YZXX_LB' => 'integer',
  685. 'YZXX_LX' => 'integer',
  686. 'YZXX_YL' => 'integer',
  687. 'YZXX_TS' => 'integer',
  688. 'YZXX_ZT' => 'integer',
  689. 'YZXX_YXBS' => 'integer',
  690. 'ZXJL_YXBS' => 'integer',
  691. 'BB_YXBS' => 'integer',
  692. 'BB_SXH' => 'integer',
  693. 'CSBW_YXBS' => 'integer',
  694. 'CSBW_SXH' => 'integer',
  695. 'CSZL_SXH' => 'integer',
  696. 'CSZL_ZT' => 'integer',
  697. 'CSZL_YXBS' => 'integer',
  698. 'CZFS_YXBS' => 'integer',
  699. 'CZFS_SXH' => 'integer',
  700. 'FSDD_YXBS' => 'integer',
  701. 'FSDD_SXH' => 'integer',
  702. 'FYXXLX_YXBS' => 'integer',
  703. 'FYXXLX_SXH' => 'integer',
  704. 'GMS_SXH' => 'integer',
  705. 'GMS_YXBS' => 'integer',
  706. 'HLXM_YXBS' => 'integer',
  707. 'HLXM_SXH' => 'integer',
  708. 'HSDD_YXBS' => 'integer',
  709. 'HSDD_SXH' => 'integer',
  710. 'HSGJ_YXBS' => 'integer',
  711. 'HSGJ_SXH' => 'integer',
  712. 'HSJPXYQ_YXBS' => 'integer',
  713. 'HSJPXYQ_SXH' => 'integer',
  714. 'HSTW_YXBS' => 'integer',
  715. 'HSTW_SXH' => 'integer',
  716. 'HSZT_YXBS' => 'integer',
  717. 'HSZT_SXH' => 'integer',
  718. 'HY_YHYS' => 'integer',
  719. 'HY_SXH' => 'integer',
  720. 'JJSS_YXBS' => 'integer',
  721. 'JJSS_SXH' => 'integer',
  722. 'JJYP_YXBS' => 'integer',
  723. 'JJYP_SXH' => 'integer',
  724. 'JWS_SXH' => 'integer',
  725. 'JWS_YXBS' => 'integer',
  726. 'JX_YXBS' => 'integer',
  727. 'JX_SXH' => 'integer',
  728. 'JY_SXH' => 'integer',
  729. 'JY_YJY' => 'integer',
  730. 'JZ_YXBS' => 'integer',
  731. 'JZ_SXH' => 'integer',
  732. 'JZCZ_YXBS' => 'integer',
  733. 'JZCZ_SXH' => 'integer',
  734. 'JZS_SXH' => 'integer',
  735. 'JZS_YXBS' => 'integer',
  736. 'JZYCZ_YXBS' => 'integer',
  737. 'JZYCZ_SXH' => 'integer',
  738. 'MZ_YXBS' => 'integer',
  739. 'MZ_SXH' => 'integer',
  740. 'MZBFZ_SXH' => 'integer',
  741. 'MZBFZ_YXBS' => 'integer',
  742. 'MZFF_YXBS' => 'integer',
  743. 'MZFF_SXH' => 'integer',
  744. 'QJFS_YXBS' => 'integer',
  745. 'QJFS_SXH' => 'integer',
  746. 'RYLB_YXBS' => 'integer',
  747. 'RYLB_SXH' => 'integer',
  748. 'RYZD_YXBS' => 'integer',
  749. 'RYZD_SXH' => 'integer',
  750. 'SB_YXBS' => 'integer',
  751. 'SB_SXH' => 'integer',
  752. 'SBQCZ_SXH' => 'integer',
  753. 'SHHM_YXBS' => 'integer',
  754. 'SHHM_SXH' => 'integer',
  755. 'SHLB_YXBS' => 'integer',
  756. 'SHLB_SXH' => 'integer',
  757. 'SQLB_YXBS' => 'integer',
  758. 'SQLB_SXH' => 'integer',
  759. 'SS_YXBS' => 'integer',
  760. 'SS_SXH' => 'integer',
  761. 'SSZL_YXBS' => 'integer',
  762. 'SSZL_SXH' => 'integer',
  763. 'SZ_YXBS' => 'integer',
  764. 'SZ_SXH' => 'integer',
  765. 'SZSJ_SXH' => 'integer',
  766. 'SZSJ_YSZSJ' => 'integer',
  767. 'TZ_SXH' => 'integer',
  768. 'TZFX_YXBS' => 'integer',
  769. 'TZFX_SXH' => 'integer',
  770. 'TZHLYQ_SXH' => 'integer',
  771. 'TZHLYQ_YXBS' => 'integer',
  772. 'TZZD_YXBS' => 'integer',
  773. 'WZCKFS_YXBS' => 'integer',
  774. 'WZCKFS_SXH' => 'integer',
  775. 'XB_YXBS' => 'integer',
  776. 'XB_SXH' => 'integer',
  777. 'XBS_SXH' => 'integer',
  778. 'XBS_YXBS' => 'integer',
  779. 'XKDJ_YXBS' => 'integer',
  780. 'XKDJ_SXH' => 'integer',
  781. 'XKYY_YXBS' => 'integer',
  782. 'XKYY_SXH' => 'integer',
  783. 'XX_YXBS' => 'integer',
  784. 'XX_SXH' => 'integer',
  785. 'XXQW_YXBS' => 'integer',
  786. 'XXQW_SXH' => 'integer',
  787. 'YJCZ_YXBS' => 'integer',
  788. 'YJCZ_SXH' => 'integer',
  789. 'YJS_SXH' => 'integer',
  790. 'YJS_YXBS' => 'integer',
  791. 'YPBM_YXBS' => 'integer',
  792. 'YPCKFS_YXBS' => 'integer',
  793. 'YPCKFS_SXH' => 'integer',
  794. 'YPDS_SXH' => 'integer',
  795. 'YPDS_ZT' => 'integer',
  796. 'YPDS_YXBS' => 'integer',
  797. 'YPDW_ZT' => 'integer',
  798. 'YPDW_YXBS' => 'integer',
  799. 'YPJX_ZT' => 'integer',
  800. 'YPJX_YXBS' => 'integer',
  801. 'YPLB_SXH' => 'integer',
  802. 'YPLB_ZT' => 'integer',
  803. 'YPLB_YXBS' => 'integer',
  804. 'YPLX_SXH' => 'integer',
  805. 'YPLX_ZT' => 'integer',
  806. 'YPLX_YXBS' => 'integer',
  807. 'YPPL_SXH' => 'integer',
  808. 'YPPL_ZT' => 'integer',
  809. 'YPPL_YXBS' => 'integer',
  810. 'YPRKFS_YXBS' => 'integer',
  811. 'YPRKFS_SXH' => 'integer',
  812. 'YPSQZT_YXBS' => 'integer',
  813. 'YPSQZT_SXH' => 'integer',
  814. 'YPYF_SXH' => 'integer',
  815. 'YPYF_ZT' => 'integer',
  816. 'YPYF_YXBS' => 'integer',
  817. 'YXCL_YXBS' => 'integer',
  818. 'YXCL_SXH' => 'integer',
  819. 'YYTJ_YXBS' => 'integer',
  820. 'YYTJ_SXH' => 'integer',
  821. 'YZTC_YXBS' => 'integer',
  822. 'YZTC_SXH' => 'integer',
  823. 'YZTCXQ_LX' => 'integer',
  824. 'YZTCXQ_YL' => 'integer',
  825. 'YZTCXQ_SXH' => 'integer',
  826. 'YZTCXQ_YXBS' => 'integer',
  827. 'ZD_YXBS' => 'integer',
  828. 'ZD_KYXG' => 'integer',
  829. 'ZD_SXH' => 'integer',
  830. 'ZDMC_SXH' => 'integer',
  831. 'ZDMC_YZDMC' => 'integer',
  832. 'ZJLX_YXBS' => 'integer',
  833. 'ZJLX_SXH' => 'integer',
  834. 'ZS_SXH' => 'integer',
  835. 'ZS_YXBS' => 'integer',
  836. 'ZSBFZ_YXBS' => 'integer',
  837. 'ZSBFZ_SXH' => 'integer',
  838. 'ZSLB_YXBS' => 'integer',
  839. 'ZSLB_SXH' => 'integer',
  840. 'ZSSX_YXBS' => 'integer',
  841. 'ZSSX_SXH' => 'integer',
  842. 'ZSXHLX_YXBS' => 'integer',
  843. 'ZSXHLX_SXH' => 'integer',
  844. 'ZW_YXBS' => 'integer',
  845. 'ZW_SXH' => 'integer',
  846. 'ZGZD_YXBS' => 'integer',
  847. 'CDXX_PID' => 'integer',
  848. 'CDXX_LX' => 'integer',
  849. 'CDXX_PX' => 'integer',
  850. 'CDXX_ZT' => 'integer',
  851. 'JSZ_PID' => 'integer',
  852. 'JSZ_ID' => 'integer',
  853. 'JSZ_PX' => 'integer',
  854. 'ZH_CJGLY' => 'integer',
  855. 'ZHJSGL_ZHID' => 'integer',
  856. 'ZHJSGL_JSID' => 'integer',
  857. 'JQR_CLCS' => 'integer',
  858. 'ZNYG_LX' => 'integer',
  859. 'SYZZ_ZT' => 'integer',
  860. 'SYZZ_DDZT' => 'integer',
  861. ];
  862. // 特殊处理带有as别名的类型转换
  863. if($column_field !== '*'){
  864. foreach ($column_field as $key => $field){
  865. if(!is_string($field)){
  866. continue;
  867. }
  868. if(strpos(strtolower($field), 'count(') !== false){
  869. $fields[$field] = 'integer';
  870. }
  871. if(is_int($key) && strpos($field, 'as') !== false){
  872. $field_arr = explode('as', $field);
  873. $old_name = trim($field_arr[0]);
  874. $new_name = trim($field_arr[1]);
  875. } else {
  876. $old_name = $key;
  877. $new_name = $field;
  878. }
  879. if(array_key_exists($old_name, $fields)){
  880. $fields[$new_name] = 'integer';
  881. }
  882. }
  883. }
  884. // 处理类型转换
  885. foreach ($column as $key => $val){
  886. if(is_array($val)){
  887. foreach ($val as $field => $v){
  888. if(array_key_exists($field, $fields)){
  889. $column[$key][$field] = (int) $v;
  890. }
  891. }
  892. }
  893. }
  894. return $column;
  895. }
  896. /**
  897. * 数据别名大写转换
  898. * @param $list
  899. * @param $fields
  900. * @return mixed
  901. */
  902. protected function formatFieldUpper($list, $fields)
  903. {
  904. if(!$list){
  905. return $list;
  906. }
  907. if(!$fields || $fields === '*'){
  908. return $list;
  909. }
  910. // 存在别名
  911. $field_arr = [];
  912. foreach ($fields as $key => $field){
  913. if(!is_string($field)){
  914. continue;
  915. }
  916. if(is_int($key) && strpos($field, 'as') !== false){
  917. $field_arr[] = trim(explode('as', $field)[1]);
  918. } else {
  919. $field_arr[] = $field;
  920. }
  921. }
  922. if(!$field_arr){
  923. return $list;
  924. }
  925. // 别名大写转换(添加小写元素,unset大写元素)
  926. if (count($list) !== count($list, COUNT_RECURSIVE)) {
  927. // 二维数组数据
  928. foreach ($list as $key => $item) {
  929. foreach ($item as $field => $val){
  930. $lo_field = strtolower($field);
  931. if(in_array($lo_field, $field_arr)){
  932. $list[$key][$lo_field] = $val;
  933. unset($list[$key][$field]);
  934. }
  935. }
  936. }
  937. } else {
  938. // 一维数组数据
  939. foreach ($list as $field => $val){
  940. $lo_field = strtolower($field);
  941. if(in_array($lo_field, $field_arr)){
  942. $list[$lo_field] = $val;
  943. unset($list[$field]);
  944. }
  945. }
  946. }
  947. return $list;
  948. }
  949. /**
  950. * column方法单个字段和2个字段特殊处理
  951. * @param $fields
  952. * @param $result
  953. * @return array
  954. */
  955. public function formatColumnField($fields, $result)
  956. {
  957. $count = count($fields);
  958. if($count === 1){
  959. return array_keys($result);
  960. } elseif ($count === 2){
  961. foreach ($result as $field => &$val){
  962. if(strpos($fields[1], 'as') !== false){
  963. $k = strtoupper(trim(explode('as', $fields[1])[1]));
  964. $val = $val[$k];
  965. } else {
  966. $val = $val[$fields[1]];
  967. }
  968. }
  969. unset($val);
  970. return $result;
  971. }
  972. return $result;
  973. }
  974. }