最近花了很多時間把項目數據庫從oracle遷移到達夢8,遷移過程當中碰上了很多問題,後面有時間我整理一下心得。
今天先發一下php使用dm_pdo操做達夢數據庫的示例代碼,裏面包括了常規的綁定變量查詢,存儲過程調用,clob類型操做等。
使用的是達夢提供的pdo_dm驅動,相關配置信息請參考達夢的官方幫助文檔(達夢8安裝時自帶)php
ini_set("display_errors","On"); ini_set('log_errors', 1); ini_set("error_log", "/usr/local/apache2/logs/dm_error.log"); error_reporting(E_ALL) //獲取變量值字符串 function strHt($var) { return print_r($var, true); } /* function xlog(string $lv, string $format, ...$args) { $log = "%s\t%s:%s\t%s" . PHP_EOL; $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); return sprintf($log, $lv, trim($backtrace[0]['file']), $backtrace[0]['line'], sprintf($format, ...$args)); } echo xlog("info", "我是一條日誌%s", ...["呀"]); ———————————————— 版權聲明:本文爲CSDN博主「安木1991」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/weixin_42900065/article/details/83509723 */ function mySubFile($str) { if ($str == "") { return ""; } return strstr($str, "inc_chk"); } //日誌打印函數 function dbgLogHt(string $format, ...$args) { $log = "%s:%s %s"; $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); #$strHt = sprintf($log, '[dbg]', trim($backtrace[1]['file']), $backtrace[1]['line'], sprintf($format, ...$args)); #($strHt, 0); error_log(sprintf($log, trim($backtrace[0]['file']), $backtrace[0]['line'], sprintf($format, ...$args))); //輸出調用堆棧 方便調試 error_log(sprintf("from %s:%s %s:%s %s:%s %s:%s %s:%s %s:%s %s:%s %s:%s" . PHP_EOL, mySubFile($backtrace[1]['file']), $backtrace[1]['line'], mySubFile($backtrace[2]['file']), $backtrace[2]['line'], mySubFile($backtrace[3]['file']), $backtrace[3]['line'], mySubFile($backtrace[4]['file']), $backtrace[4]['line'], mySubFile($backtrace[5]['file']), $backtrace[5]['line'], mySubFile($backtrace[6]['file']), $backtrace[6]['line'], mySubFile($backtrace[7]['file']), $backtrace[7]['line'], mySubFile($backtrace[8]['file']), $backtrace[8]['line']) ); # error_log(strHt($backtrace)); } function testPdo() { try { dbgLogHt("<pre>"); //dm:表明使用達夢pdo驅動 $pdo = new PDO("dm:host=127.0.0.1", "user_hch", "pass:kingstarer"); //設置報錯方式爲拋出異常 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $rs = $pdo->query("SELECT * FROM V\$VERSION WHERE ROWNUM = 1;"); $rs->setFetchMode(PDO::FETCH_ASSOC); $result_arr = $rs->fetchAll(); error_log(strHt($result_arr)); $arr = []; //測試綁定變量 包括入參和出參 $arr[":iCount"] = '5'; $arr[":rn"] = 'hhc'; $strSql = "select :rn rn, table_name from user_tables where rownum < :iCount"; $stmt = $pdo->prepare($strSql); $stmt->bindParam(":rn", $arr[":rn"]); $stmt->bindParam(":iCount", $arr[":iCount"]); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // $row是一行,使用while依次輸出下一行 dbgLogHt("while"); dbgLogHt(strHt($row)); error_log(strHt($row)); } dbgLogHt("<pre>"); // 測試存儲過程調用 $strSql = "begin :ret := f_prod_demo(:num, 'UPD', 123, :o_err_code, :o_err_msg, :o_call_stack); end;"; $stmt = $pdo->prepare($strSql); /* //用這種 比較簡潔 但實際測試發現不行 $arr = []; $arr[':num'] = '123'; $arr[':ret'] = 'o_err_code'; $arr[':o_err_code'] = 'o_err_code'; $arr[':o_err_msg'] = 'o_err_msg'; $arr[':o_err_msg'] = 'o_call_stack'; $stmt->execute($arr); print_r($arr); */ $arr = []; $arr[':num'] = '123'; $arr[':ret'] = 'o_err_code'; $arr[':o_err_code'] = 'o_err_code'; $arr[':o_err_msg'] = 'o_err_msg'; $arr[':o_err_msg'] = 'o_call_stack'; $stmt->bindParam(':num', $arr[':num']); $stmt->bindParam(':ret', $arr[':ret']); $stmt->bindParam(':o_err_code', $arr[':o_err_code']); $stmt->bindParam(':o_err_msg', $arr[':o_err_msg']); $stmt->bindParam(':o_call_stack', $arr[':o_call_stack']); $stmt->execute(); error_log(strHt($arr)); $stmt->closeCursor(); //測試達夢插入clob數據 $strSql = "INSERT into HCH_TEST values(1, '333')"; $stmt = $pdo->prepare($strSql); $stmt->execute(); error_log("insert clob ok"); $stmt->closeCursor(); //測試使用綁定變量插入clob類型數據 $strSql = "INSERT into HCH_TEST values(:id, :mess)"; error_log("<prepare>"); $stmt = $pdo->prepare($strSql); error_log("<prepare ok>"); $arr[':id'] = "123"; $stmt->bindParam(':id', $arr[':id']); error_log("<bindParam ok>"); $arr[':mess'] = "123"; $stmt->bindParam(':mess', $arr[':mess']); error_log("<bindParam ok>"); $stmt->execute(); error_log("<execute ok>"); $stmt->closeCursor(); error_log("insert clob param ok"); error_log("<pre>"); $pdo = null; //更多達夢數據庫開發經驗請參考: https://www.cnblogs.com/kingstarer/ } catch (PDOException $e) { error_log("Error: " . $e->getMessage()); error_log("<pre>"); //die(); } //exit(1); }
網上關於達夢的資料比較少,但願這篇心得能起拋磚引玉的效果。數據庫