4

在 Oracle Toad 中执行以下语句

exec plsql_procedure(select 'somestring' from dual);

引发以下异常:

ORA-06550:第 1 行,第 33 列:PLS-00103:在预期以下情况之一时遇到符号“SELECT”:

( ) - + case mod new 不为空

过程采用一个 VARCHAR2 参数。如何修复?

4

4 回答 4

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;
/
于 2013-03-26T09:24:39.383 回答
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

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

于 2013-03-26T09:22:18.350 回答
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;
于 2013-03-26T10:06:58.820 回答
0

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

分享和享受。

于 2013-03-26T11:20:09.063 回答