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

时间:2013-03-26 09:17:16

标签: sql oracle plsql toad

在Oracle Toad中执行以下语句

exec plsql_procedure(select 'somestring' from dual);

表示以下异常:

ORA-06550:第1行,第33栏: PLS-00103:遇到以下任何一种情况时遇到符号“SELECT”:

() - + case mod new not null     

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

4 个答案:

答案 0 :(得分:3)

除非您使用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;
/

答案 1 :(得分:2)

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

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;
/

<强>输出:

PROCEDURE testProc compiled
anonymous block completed
Testing

当事情没有发生时,我们必须忍受其他选择。我们的最终目标只是完成工作。我们为完成它而做了什么并不重要。

答案 2 :(得分: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 :(得分:0)

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

分享并享受。