【发布时间】:2021-10-31 17:55:19
【问题描述】:
实际上,我正在创建带有替换的存储过程,在尝试编译过程时,我得到了弹出窗口以在编译自身时输入替换值,而不是在执行时弹出窗口。
请分享你的想法来编译程序而不询问替换
【问题讨论】:
-
请提供足够的代码,以便其他人更好地理解或重现问题。
标签: oracle plsql plsqldeveloper plsql-package
实际上,我正在创建带有替换的存储过程,在尝试编译过程时,我得到了弹出窗口以在编译自身时输入替换值,而不是在执行时弹出窗口。
请分享你的想法来编译程序而不询问替换
【问题讨论】:
标签: oracle plsql plsqldeveloper plsql-package
你不能!在运行语句时,替换变量的作用类似于客户端应用程序中的查找-替换操作;数据库确实没有看到替换变量,因为您正在使用的客户端应用程序已经执行了查找替换操作。对于一个过程,这将是在CREATE PROCEDURE 语句从客户端发送到要编译的数据库时。它不是数据库执行的操作。
如果您在不支持替换变量的客户端(或在关闭替换变量后支持它的客户端中尝试使用,例如,在客户端应用程序中使用命令SET DEFINE OFF),那么您将得到一个编译错误。 db<>fiddle
如果您想使用替换变量,请在调用过程时在匿名块中使用它们。
一个示例过程将接受参数并且没有替换变量:
CREATE PROCEDURE procedure_name(
p_value IN NUMBER
)
IS
BEGIN
-- Do something
DBMS_OUTPUT.PUT_LINE( p_value );
END;
/
然后,当您要执行该过程时,您可以在调用块中使用替换变量:
BEGIN
procedure_name( &value );
END;
/
【讨论】:
在 SQL*Plus 或 Oracle SQL Developer 中,您将使用 SET DEFINE OFF。您使用 PL/SQL Developer 标记(这是我不使用的工具)标记了问题,但是 - 看看 this 是否有帮助。
然而:我建议你不要那样做。如果您正在创建存储过程,请使用它的参数,不要要求替换变量。像这样的:
SQL> set serveroutput on
SQL> create or replace procedure p_test (par_deptno in dept.deptno%type) is
2 begin
3 dbms_output.put_line('Department ' || par_deptno);
4 end;
5 /
Procedure created.
SQL> exec p_test(10);
Department 10
PL/SQL procedure successfully completed.
您现在可以重用这样的过程,传递您想要的任何参数值。
你现在的做法:
SQL> create or replace procedure p_test is
2 begin
3 dbms_output.put_line('Department ' || &par_deptno);
4 end;
5 /
Enter value for par_deptno: 25
old 3: dbms_output.put_line('Department ' || &par_deptno);
new 3: dbms_output.put_line('Department ' || 25);
Procedure created.
SQL> exec p_test
Department 25
PL/SQL procedure successfully completed.
SQL>
您可以多次运行该过程,但在整个会话期间它始终会显示(即使用)相同的值。一旦您退出并再次登录,程序将始终使用相同的值。
【讨论】: