php操作達夢資料庫示例代碼(包括綁定變數,存儲過程調用,clob類型操作等)

来源:https://www.cnblogs.com/kingstarer/archive/2020/06/09/13071771.html
-Advertisement-
Play Games

最近花了不少時間把項目資料庫從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);
}

網上關於達夢的資料比較少,希望這篇心得能起拋磚引玉的效果。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. Kubernetes是什麼 Kubernetes中文版資料 Kubernetes是容器集群管理系統,是一個開源的平臺,可以實現容器集群的自動化部署、自動擴縮容、維護等功能。 通過Kubernetes我們可以: 快速部署應用 快速擴展應用 無縫對接新的應用功能 * 節省資源,優化硬體資源的使用 ...
  • 為什麼要用索引? 一般的應用系統,讀寫比例在10:1左右,插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,因此對查詢語句的優化顯然是重中之重。說起加速查詢,就不得不提到索引了。 索引是什麼? 索引在MySQL中也叫做“鍵”,是存儲引 ...
  • Redis集群是Redis提供的分散式資料庫方案,集群通過分片來進行數據共用,並提供複製和故障轉移操作。 一個Redis集群通常由多個節點組成,在剛開始的時候每個節點都是相互獨立的,他們處於一個只包含自己的集群當中,我們通過使用CLUSTER MEET命令將節點連接到一起,構成一個包含多節點的集群。 ...
  • 結構化查詢語言(SQL)是第四代編程語言的典型,這種命令式的語言更像一種指令,使用它,你只需要告訴電腦“做什麼”,而不用告訴電腦“怎麼做”。第四代編程語言普遍具有簡單、易學、能更快的投入生產等優點,但也失去了部分第三代編程語言(C,C++,Java等)的靈活性。PL/SQL 在 SQL 的基礎上... ...
  • 2020-06-09 19:31:01 一、疑問 前段時間;QQ群里有人對“這個表(0,4)這行數據我做了update操作,查看索引的page數據,看到索引一直指向(0,4),用ctid='(0,4)'查詢業務表是查不到數據的;然後我做了表的vacuum,reindex甚至drop/create i ...
  • 1. API基本概念 Flink程式可以對分散式集合進行轉換(例如: filtering, mapping, updating state, joining, grouping, defining windows, aggregating) 集合最初是從源創建的(例如,從文件、kafka主題或本地內 ...
  • 參考:1、vmware安裝centos ,ping 百度 成功https://www.cnblogs.com/jpwz/p/10466826.html 2、vmware克隆centos7後網路配置和主機名問題https://blog.csdn.net/mo_ing/article/details/8 ...
  • 一:MongoDB 概述 一、NoSQL 簡介 1. 概念:NoSQL(Not Only SQL的縮寫),指的是非關係型資料庫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。用於超大規模數據的存儲,數據存儲不需要固定的模式,無需多餘操作就可以橫向擴展。 2. 特點 1. 優點:具有高可擴展性、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...