4

OracleToadで次のステートメントを実行する

exec plsql_procedure(select 'somestring' from dual);

次の例外が発生します。

ORA-06550:1行33列:PLS-00103:次のいずれかが必要な場合に記号「SELECT」が検出されました。

()-+ case mod new not null

プロシージャは1つのVARCHAR2パラメータを取ります。どうすれば修正できますか?

4

4 に答える 4

3

デュアルからの選択の使用が他の何かの単なる例でない限り、選択を省略してください。

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、どのような状況でも引数リストのステートメントを許可していないようです。

私がしたことの1つは、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

覚えておくべきことの1つは、リレーショナルクエリはVALUEを返さず、TABLEを返すことです。特定のSELECTが単一の行のみを返すことはコンテキスト(DUALからのリテラル値の選択など)によってわかっている場合でも、データベースはそれを認識せず、SELECTが複数の行を持つテーブルを返すと想定します。SELECT 1 FROM DUALでさえ、テーブルを返します。このテーブルには1つの列と1つの行がありますが、それでもテーブルです。:-)

共有してお楽しみください。

于 2013-03-26T11:20:09.063 に答える