GetData
Delphi から次のパラメータを指定して呼び出される oracle 関数を呼び出す必要があります。
(RESULT) NUMBER
P1 VARCHAR2 IN
P2 VARCHAR2 IN
P3 VARCHAR2 IN
P4 VARCHAR2 OUT
私が使用しようとしているコードは次のとおりです。
q := TADOQuery.Create(nil);
q.Connection := conn;
q.SQL.Add('BEGIN');
q.SQL.Add(' SELECT GetData(:IN_1,:IN_2,:IN_3,:OUT_1) into :OUT_2 from dual;');
q.SQL.Add('END;');
q.Parameters.ParamByName('IN_1').DataType:=ftString;
q.Parameters.ParamByName('IN_1').Direction:=pdInput;
q.Parameters.ParamByName('IN_1').Size:=3;
q.Parameters.ParamByName('IN_1').Value:='001';
q.Parameters.ParamByName('IN_2').DataType:=ftString;
q.Parameters.ParamByName('IN_2').Direction:=pdInput;
q.Parameters.ParamByName('IN_2').Size:=15;
q.Parameters.ParamByName('IN_2').Value:='88000000000';
q.Parameters.ParamByName('IN_3').DataType:=ftString;
q.Parameters.ParamByName('IN_3').Direction:=pdInput;
q.Parameters.ParamByName('IN_3').Size:=64;
q.Parameters.ParamByName('IN_3').Value:='';
q.Parameters.ParamByName('OUT_1').DataType:=ftString;
q.Parameters.ParamByName('OUT_1').Direction:=pdOutput;
q.Parameters.ParamByName('OUT_1').Size:=255;
q.Parameters.ParamByName('OUT_1').Value:='';
q.Parameters.ParamByName('OUT_2').DataType:=ftInteger;
q.Parameters.ParamByName('OUT_2').Direction:=pdOutput;
q.Parameters.ParamByName('OUT_2').Value:='0';
q.Open;
responseEdit.Text:=q.Parameters.ParamByName('OUT_1').Value;
しかし、私は得るORA-06572: Function GETDATA has OUT arguments
。私がこれを理解している限り、Oracle の SELECT ステートメントで OUT パラメータを持つ関数を使用することはできません...
では、それをどのように呼び出すのですか?
たとえば、Javaでは、次の構文でこれを行うことができました。
CallableStatement cs = conn.prepareCall("{ call ? := GetData(?,?,?,?)}");
残念ながら、Delphi では動作しません...
私はまた、構文でそれを呼び出そうとしました:
q.SQL.Add('BEGIN');
q.SQL.Add(' :OUT_2 := GetData(:IN_1,:IN_2,:IN_3,:OUT_1);');
q.SQL.Add('END;');
しかし、Delphi は:=
シンボルをパラメーターとして誤解しているようです。そのため、Oracle が破損し、PLS-00103: Encountered the symbol "" when expecting one of the following := . ( @ % ; indicator
例外がスローされます....または、すでに周りのスペースを削除すると、:=
Delphi はいくつかの一般的な EOLEException をスローします。
で電話してみましたTADOStoredProc
:
stp := TADOStoredProc.Create(nil);
stp.Connection := conn;
//stp.ProcedureName:='GetData'; //also tried this
stp.ProcedureName:=':OUT_2 := GetData(:IN_1,:IN_2,:IN_3,:OUT_1)';
stp.Parameters.CreateParameter('OUT_2',ftInteger,pdOutput,4,0);
stp.Parameters.CreateParameter('IN_1',ftString,pdInput,3,'101');
stp.Parameters.CreateParameter('IN_2',ftString,pdInput,15,phoneEdit.Text);
stp.Parameters.CreateParameter('IN_3',ftString,pdInput,64,' ');
stp.Parameters.CreateParameter('OUT_1',ftString,pdOutput,255,' ');
stp.ExecProc;
不明な OleException をスローします。stp.ProcedureName:='GetData';
のようにproc 名を指定すると、 と表示されますwrong number or types of parameters specified
。
私は同じことをやってみましたTADOCommand
:
cmd := TADOCommand.Create(nil);
cmd.Connection := conn;
cmd.CommandType := cmdStoredProc;
cmd.CommandText := ' :OUT_2 := GetData(:IN_1,:IN_2,:IN_3,:OUT_1); ';
...
ここでも、Delphi は不明な OleException をスローします。
そのため、Oracle と Delphi の両方で間違った構文を使用しているか、Delphi にパラメータを渡していないため、Oracle への正しい呼び出しをフォーマットできません...
しかし、OUTパラメータなしでOracle関数を呼び出すとき、またはms sql関数を呼び出すとき(outパラメータがなくても...)、これはすべて機能します。それで、ここで何が問題なのですか?