php操作达梦数据库示例代码(包括绑定变量,存储过程调用,clob类型操作等)

php操作达梦数据库示例代码(包括绑定变量,存储过程调用,clob类型操作等)最近花了不少时间把项目数据库从oracle迁移到达梦8,迁移过程中碰上了不少问题,后面有时间我整理一下心得。 今天先发一下php使用dm_pdo操作达梦数据库的示例代码,里面包括了常规的绑定变量查询,

php操作达梦数据库示例代码(包括绑定变量,存储过程调用,clob类型操作等)

最近花了不少时间把项目数据库从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	%s:%s	%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);
}

代码100分

网上关于达梦的资料比较少,希望这篇心得能起抛砖引玉的效果。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8017.html

(0)
上一篇 2023-03-09
下一篇 2023-03-09

相关推荐

  • 「Flink」Flink中的时间类型「建议收藏」

    「Flink」Flink中的时间类型「建议收藏」Flink中的时间类型和窗口是非常重要概念,是学习Flink必须要掌握的两个知识点。Flink中的时间类型时间类型介绍Flink流式处理中支持不同类型的时间。分为以下几种:处理时间Flink程序执行对

    2023-01-26
    173
  • docker 使用mysqldump命令备份导出项目中的mysql数据

    docker 使用mysqldump命令备份导出项目中的mysql数据下图为镜像重命名后的镜像名为uoj,现在要把这个镜像中的mysql导出 运行如下命令: docker exec -it uoj mysqldump -uroot -proot app_uoj233 &

    2022-12-24
    150
  • 大数据Hadoop之——任务调度器Azkaban(Azkaban环境部署)「建议收藏」

    大数据Hadoop之——任务调度器Azkaban(Azkaban环境部署)「建议收藏」一、概述 1)什么是任务调度? 大数据平台技术框架支持的开发语言多种多样,开发人员的背景差异也很大,这就产生出很多不同类型的程序(任务)运行在大数据平台之上,如:MapReduce、Hive、Pig、

    2023-05-17
    134
  • 前端必读书_前端阅读

    前端必读书_前端阅读的确,有些标题党了。起因是微信群里,有哥们问我,你是怎么学习前端的呢?能不能共享一下学习方法。一句话也挺触动我的,我真的不算是什么大佬,对于学习前端知识,我也不能说是掌握了什么捷径。当然,我个人的学习方法这篇文章已经在写了,预计这周末会在我个人公众号发布。而在此之前,我想展(g…

    2023-03-02
    143
  • Python中namedtuple的使用

    Python中namedtuple的使用在Python中,有时需要自定义简单但是有名字的记录类型,如果使用字典或普通元组,通常会显得有点笨重。此时,strongnamedtuple/strong就成为了一个很好的选择。namedtuple是Python标准库collections中的一个函数,用于创建和实例化类似于元组的对象,但这些对象有名称,可以像字典一样通过名称来访问字段。namedtuple相当于一个轻量级的类定义器,它本质上是一个Python类,可以像其他类一样继承、实例化、序列化和扩展。

    2024-09-05
    22
  • 使用Python创建文件夹

    使用Python创建文件夹创建文件夹是在编写Python程序时经常需要用到的操作之一。在Python中,我们可以使用多种方法来创建文件夹。无论我们使用哪种方法,都是基于操作系统提供的API来完成的。

    2024-06-14
    50
  • python调用卸载dll,python卸载教程[通俗易懂]

    python调用卸载dll,python卸载教程[通俗易懂]可以的,python中一般有两种方法调用DLL中的函数。1.直接使用函数名,函数名可以用dependencywalker等工具查看。(这个工具在vc或者vs的工具包中)[python]viewplaincopyimportctypesdll=CTYPES.CDLL(“test.dll”)res=test(3,4)2.使用Ordinal,Ordinal可以用dependencywalker等工具查看。[python]viewplaincopyimportctypesdll=CTYPES.CDLL(“test.dll”)res=dll[1](3,4)

    2023-08-24
    124
  • 使用PostgreSQL注意事项[通俗易懂]

    使用PostgreSQL注意事项[通俗易懂]一、大小写特别敏感 大写字段需要用“”引号(pg字段名使用“”,MySQL字段名使用“) ******表名以及字段名如果是小写但是为关键字,比如name,则也需使用""; 二、分

    2023-02-12
    273

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注