广告
返回顶部
首页 > 资讯 > 数据库 >DBMS_SQL 执行 PL/SQL 代码块示例
  • 354
分享到

DBMS_SQL 执行 PL/SQL 代码块示例

DBMS_SQL执行PL/SQL代码块示例 2015-03-14 06:03:59 354人浏览 绘本
摘要

通常情况下,需要动态执行 PL/sql 代码块尽量使用语法更简洁的 EXECUTE IMMEDIATE ... 但当绑定变量的数量甚至类型都可能变化时,还是需要使用更灵活的 DBMS_SQL 包,下面是使用 DBMS_SQL 执行 PL/

DBMS_SQL 执行 PL/SQL 代码块示例

通常情况下,需要动态执行 PL/sql 代码块尽量使用语法更简洁的 EXECUTE IMMEDIATE ...

但当绑定变量的数量甚至类型都可能变化时,还是需要使用更灵活的 DBMS_SQL 包,下面是使用 DBMS_SQL 执行 PL/SQL 代码块的示例:

-- SELECT * FROM Dba_Objects Do WHERE Do.Object_Name LIKE "EXEC_BLOCK_%";
DECLARE
  c_Function_Name CONSTANT VARCHAR2(30) := "EXEC_BLOCK_" ||
                                           To_Char(SYSDATE, "HH24MISS") ||
                                           "_TEST";
  l_c      INTEGER;
  l_Return NUMBER;
  l_s      VARCHAR2(2);
  l_d      DATE;
BEGIN
  -- 新建测试用的存储过程
  EXECUTE IMMEDIATE "CREATE FUNCTION " || c_Function_Name || "(p_n  IN NUMBER,
                                                  x_s  OUT VARCHAR2,
                                                  Px_d IN OUT DATE)
  RETURN NUMBER IS
BEGIN
  CASE
    WHEN p_n BETWEEN 1 AND 9 THEN
      x_s := p_n * 10 + p_n;
  END CASE;
  Px_d := Px_d + 1;
  RETURN To_Number(x_s || x_s);
END;";
  l_c := Dbms_Sql.Open_Cursor();
  -- 执行无输入输出代码块
  Dbms_Sql.Parse(l_c, "begin NULL; end;", Dbms_Sql.Native);
  Dbms_Output.Put_Line("EXECUTE: " || Dbms_Sql.Execute(l_c));
  -- 执行有输入输出的代码块
  Dbms_Sql.Parse(l_c"begin :x_return := " || c_Function_Name || "(:p_n, :x_s, :px_d); end;"Dbms_Sql.Native);
  Dbms_Sql.Bind_Variable(l_c, ":X_RETURN", 0); -- 输出参数,值可随意填写,仅用于确定类型
  Dbms_Sql.Bind_Variable(l_c, ":P_N", 3); -- 输入参数,填写要传入的值即可
  Dbms_Sql.Bind_Variable(l_c, ":X_S", "X", 2); -- 输出参数,值可随意填写,仅用于确定类型;不指定 VARCHAR2 长度时,默认为 1
  Dbms_Sql.Bind_Variable(l_c, ":PX_D", SYSDATE); -- 输入输出参数,填写要传入的值
  Dbms_Output.Put_Line("EXECUTE: " || Dbms_Sql.Execute(l_c));
  Dbms_Sql.Variable_Value(l_c, ":X_RETURN", l_Return); -- 输出参数,使用变量接收传出的值
  Dbms_Sql.Variable_Value(l_c, ":X_S", l_s); -- 输出参数,使用变量接收传出的值
  Dbms_Sql.Variable_Value(l_c, ":PX_D", l_d); -- 输入输出参数,使用变量接收传出的值
  Dbms_Output.Put_Line(l_Return);
  Dbms_Output.Put_Line(l_s);
  Dbms_Output.Put_Line(To_Char(l_d, "YYYY/MM/DD HH24:MI:SS"));
  Dbms_Sql.Close_Cursor(l_c);
  -- 删除测试用的存储过程
  EXECUTE IMMEDIATE "DROP FUNCTION " || c_Function_Name;
EXCEPTION
  WHEN OTHERS THEN
    EXECUTE IMMEDIATE "DROP FUNCTION " || c_Function_Name;
    Dbms_Output.Put_Line(Dbms_Utility.FORMat_Error_Backtrace || SQLERRM);
END;

您可能感兴趣的文档:

--结束END--

本文标题: DBMS_SQL 执行 PL/SQL 代码块示例

本文链接: https://www.lsjlt.com/news/6766.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作