最近花了不少時間把項目資料庫從oracle遷移到達夢8,遷移過程中碰上了不少問題,後面有時間我整理一下心得。 今天先發一下php使用dm_pdo操作達夢資料庫的示例代碼,裡面包括了常規的綁定變數查詢,存儲過程調用,clob類型操作等。 使用的是達夢提供的pdo_dm驅動,相關配置信息請參考達夢的官方 ...
最近花了不少時間把項目資料庫從oracle遷移到達夢8,遷移過程中碰上了不少問題,後面有時間我整理一下心得。
今天先發一下php使用dm_pdo操作達夢資料庫的示例代碼,裡面包括了常規的綁定變數查詢,存儲過程調用,clob類型操作等。
使用的是達夢提供的pdo_dm驅動,相關配置信息請參考達夢的官方幫助文檔(達夢8安裝時自帶)
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);
}
網上關於達夢的資料比較少,希望這篇心得能起拋磚引玉的效果。