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;
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341