首页 文章

从Select语句将varchar2参数传递给plsql过程

提问于
浏览
3

在Oracle Toad中执行以下语句

exec plsql_procedure(select 'somestring' from dual);

转发以下异常:

ORA-06550:第1行第33列:PLS-00103:遇到以下其中一项时遇到符号“SELECT”:

() - case mod new not null

过程采用一个VARCHAR2参数 . 怎么修好?

4 回答

  • 2

    除非你使用select from dual只是其他一些例子,否则请忽略选择 .

    exec plsql_procedure('somestring');
    

    否则,选择一个变量并将其传递给过程 .

    declare
      my_var table_name.column_name%Type;
    begin
    
      select column_name
      into   my_var
      from   table_name
      where  ...;
    
      plsql_procedure(parameter_name => my_var);
    
    end;
    /
    
  • 0

    我尝试过几种方法 . 其中包括:

    exec plsql_procedure((select 'somestring' from dual));
    
    EXECUTE IMMEDIATE ('testProc('''||(SELECT 'Testing' FROM dual)||''')');
    
    EXECUTE IMMEDIATE ('EXEC testProc('''||(SELECT 'Testing' FROM dual)||''')');
    

    以上都没有奏效 . 看起来Oracle在任何情况下都不允许在参数列表中使用 SELECT 语句 .

    我做的一件事是将 SELECT 查询结果存储到变量中,并在以后使用它,如下所示:

    CREATE OR REPLACE PROCEDURE testProc (
       testVar IN VARCHAR2 -- Proc accepts VARCHAR2
    ) IS
    BEGIN
        dbms_output.put_line(testVar);
    END;
    /
    
    SET SERVEROUTPUT ON
    DECLARE
      testVarIn VARCHAR(2000); -- Declare the variable
    BEGIN
      SELECT 'Testing' INTO testVarIn FROM dual;
      -- Accept its value using SELECT ... INTO 
    
      testProc(testVarIn); -- Use the variable value to pass to the proc
    END;
    /
    

    Output:

    PROCEDURE testProc compiled
    anonymous block completed
    Testing
    

    当事情没有发生时,我们必须接受替代方案 . 我们的最终目标只是完成工作 . 我们为完成它而做了什么并不重要 .

  • 1

    功能可能,但不适用于程序 . 请注意, select 需要括在括号中,因此在下面的选择中使用双括号 .

    create or replace function foo (x varchar2) return integer is
    begin 
      --Do various stuff;
      return 1;
    end;
    /
    
    select foo((select 'somestring' from dual)) from dual;
    
  • 3

    要记住的一件事是关系查询不返回VALUE - 它返回一个TABLE . 即使我们可能知道由于上下文(例如从DUAL中选择一个文字值),特定的SELECT只返回一行,但数据库不知道这一点,并假设SELECT将返回一个包含多行的表 . 即使SELECT 1 FROM DUAL返回一个表 - 该表有一列和一行,但它仍然是一个表 . :-)

    分享和享受 .

相关问题