PL / SQL:USING子句和动态变量

时间:2015-08-04 14:20:27

标签: oracle plsql

以下存储过程是为了接受参数my_seconds,创建一个日期变量my_date,它是当前日期加上(或减去)my_seconds中的数字,并打印约会。

CREATE OR REPLACE PROCEDURE test (my_seconds NUMBER)
IS    
my_date DATE;
BEGIN    
   execute immediate 'select sysdate + interval '':1'' second from dual' into my_date USING &my_seconds;
   DBMS_OUTPUT.PUT_LINE('DATE:' || my_date);  
END

但是,当编译过程(使用Oracle SQL开发人员)时,它会提示输入my_seconds的值,并且无法正确创建过程。

这一行应该如何:

execute immediate 'select sysdate + interval '':1'' second from dual' into my_date USING &my_seconds ;

重写?

由于

3 个答案:

答案 0 :(得分:5)

你可以像这样编写你的程序,而不是立即执行:

CREATE OR REPLACE PROCEDURE test (my_seconds NUMBER)
IS    
my_date DATE;
BEGIN    
   select sysdate + my_seconds * interval '1' second into my_date from dual;
   DBMS_OUTPUT.PUT_LINE('DATE:' || my_date);  
END

答案 1 :(得分:1)

您可以一起放弃SQL语句并使用它:

CREATE OR REPLACE PROCEDURE test( my_seconds NUMBER )
IS
  my_date DATE;
BEGIN
  my_date := sysdate + numtodsinterval( my_seconds, 'second' );
  DBMS_OUTPUT.PUT_LINE( 'DATE:' || my_date );
END;

这样做可以避免将上下文从PL / SQL切换到SQL并再次返回。

但是,要回答关于如何在SQL Developer中编译代码的原始问题并避免代码中冒号引起的绑定变量提示,请使用“运行脚本”命令而不是“运行语句”命令(F5而不是F9)使用默认键映射或单击看起来像带有绿色三角形的页面的图标而不是仅仅是绿色三角形的图标。

或者,右键单击连接树中的“过程”节点,选择“新建过程”,根据需要填写空白,然后单击“确定”,然后将代码粘贴到已打开的过程编辑器中。在这里,您可以单击两个齿轮图标或键入CTRL-S来编译代码。

答案 2 :(得分:0)

你也可以尝试一下。它的工作原理

CREATE OR REPLACE PROCEDURE test_AV_PROC (my_seconds NUMBER)
IS    
my_date TIMESTAMP;
BEGIN    
   execute immediate 'select :1 + INTERVAL''' ||my_seconds||''''||'SECOND'|| ' from dual ' into my_date USING SYSTIMESTAMP;
   DBMS_OUTPUT.PUT_LINE('DATE:' || my_date);  
END;