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

从Select语句向plsql过程传递varchar2参数,sql,oracle,plsql,toad,Sql,Oracle,Plsql,Toad,在OracleToad中执行以下语句 exec plsql_procedure(select 'somestring' from dual); t显示以下例外情况: ORA-06550:第1行第33列: PLS-00103:在预期以下情况时遇到符号选择: -+案例mod new不为空 过程接受一个VARCHAR2参数。如何修复它 我尝试了几种方法。这些措施包括: exec plsql_procedure((select 'somestring' from dual)); EXECUTE I

在OracleToad中执行以下语句

exec plsql_procedure(select 'somestring' from dual);
t显示以下例外情况:

ORA-06550:第1行第33列: PLS-00103:在预期以下情况时遇到符号选择:

-+案例mod new不为空


过程接受一个VARCHAR2参数。如何修复它

我尝试了几种方法。这些措施包括:

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;
/
输出:


当事情没有发生时,我们不得不接受其他选择。我们的最终目标就是完成这项工作。我们做什么来完成它并不重要。

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

它可以用于功能,但不能用于程序。请注意,select需要用括号括起来,因此下面的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;

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


分享和享受。

问题是我有更复杂的Select语句。我只是简化了这个例子。@Peter17:编辑了我的答案。请看。即使Oracle允许使用查询作为参数,为了清晰起见,我也不会使用这种技术。可以将查询结果直接传递到pl/sql对象的唯一方法是使用流水线函数,但这相当专业。这是对的@DavidAldridge!当我为真正的目的编写代码时,即使我没有尝试将select语句放入过程的参数列表中,我也没有看到有人这样做。这只在被调用的子例程是函数的情况下起作用,并且您是从select中的双圆括号内调用该函数的。如果您尝试声明i整数;开始i:=foo从DUAL中选择“somestring”;DBMS_OUTPUT.PUT_LINEi;终止它仍然会出错。用“somestring”替换括号中的SELECT会导致上述操作。是的,原因是用SELECT替换VARCHAR在SQL中有效,但在PL/SQL中无效。SQL和PL/SQL之间有一个区别,这是一个明显区别的例子。我在PL/SQL中以各种方式处理了这个问题-尝试将SELECT FOOSELECT'somestring'。。。在光标等中,仍然无法使其工作。也许在甲骨文第12章-您可以通过创建一个包装器来解决这个问题:选择BAR'somestring'。。。其中BAR为函数BARs varchar2返回整数为x vharchar2;开始从双重选择s到x;返回foox;终止
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;