OracleToadで次のステートメントを実行する
exec plsql_procedure(select 'somestring' from dual);
次の例外が発生します。
ORA-06550:1行33列:PLS-00103:次のいずれかが必要な場合に記号「SELECT」が検出されました。
()-+ case mod new not null
プロシージャは1つのVARCHAR2パラメータを取ります。どうすれば修正できますか?
デュアルからの選択の使用が他の何かの単なる例でない限り、選択を省略してください。
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;
/
私はいくつかのアプローチを試しました。それらが含まれます:
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
物事が起こらないとき、私たちは代替案と一緒に暮らす必要があります。私たちの最終目標は、仕事を成し遂げることです。それを成し遂げるために私たちが何をするかは問題ではありません。
関数では可能ですが、プロシージャでは不可能です。括弧で囲む必要があることに注意してください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;
覚えておくべきことの1つは、リレーショナルクエリはVALUEを返さず、TABLEを返すことです。特定のSELECTが単一の行のみを返すことはコンテキスト(DUALからのリテラル値の選択など)によってわかっている場合でも、データベースはそれを認識せず、SELECTが複数の行を持つテーブルを返すと想定します。SELECT 1 FROM DUALでさえ、テーブルを返します。このテーブルには1つの列と1つの行がありますが、それでもテーブルです。:-)
共有してお楽しみください。