我用的是 ODAC5.1,在对Oracle10g处理大字段,如BLOB时,一直报错。
错误描述如下:
ORA-00600:internal error code,arguments:[17147],[0xB730D8BC],[],[]
ORA-06502:PL/SQL:numeric or value error
ORA-06512:at line 3
 
以下是有关程序说明:
 Oracle10g CREATE TABLE ODAC_BLOB (
  ID NUMBER PRIMARY KEY,
  Title VARCHAR2(30),
  Pic BLOB
);CREATE OR REPLACE
PROCEDURE ODAC_BLOB_Insert (
  p_ID NUMBER,
  p_Title VARCHAR2,
  p_Pic OUT BLOB
)
is
begin
  INSERT INTO ODAC_BLOB(ID, Title, Pic)
  VALUES (p_ID, p_Title, EMPTY_BLOB())
  RETURNING Pic
  INTO p_Pic;
end;Delphi7.0 程序片段:        with OraStoredProc do begin
          StoredProcName := 'ODAC_BLOB_Insert';
          PrepareSQL;  // receive parameters          ParamByName('p_ID').AsInteger := 10;
          ParamByName('p_Title').AsString := ExtractFileName(FileName);          ParamByName('p_Pic').ParamType := ptInput;  // to transfer Lob data to Oracle
          ParamByName('p_Pic').AsOraBlob.LoadFromFile(FileName);
          Execute;
        end;

解决方案 »

  1.   

    我的解决思路,可供你参考
    //一个参数有返回值function TStoreProOCI.GetOneParam(FuncName: string; Param, Value: string):
        string;var
        OraStoredProc1                      : TOraStoredProc;
        Str                                 : string;begin
        OraStoredProc1 := TOraStoredProc.Create(nil);
        try
            OraStoredProc1.Session := FMyComDBConn.FSession;
            OraStoredProc1.SQL.Add('begin');
            Str := Format(':RESULT :=%s(:%s);', [FuncName, Param]);
            OraStoredProc1.SQL.Add('end;');        OraStoredProc1.StoredProcName := FuncName;
            OraStoredProc1.Params.CreateParam(ftString, 'Result', ptResult);
            OraStoredProc1.Params.CreateParam(ftString, Param, ptInput);        OraStoredProc1.ParamByName(Param).Value := Value;        OraStoredProc1.Execute;
            Result := OraStoredProc1.ParamByName('Result').AsString;
            OraStoredProc1.Close;    finally
            OraStoredProc1.Free;
        end;
    end;
    当Result返回值,太长了,如超过8000,就会出现ORA-06502:PL/SQL:numeric or value error 
    ORA-06512,字符缓冲太小buffer too small
    修改
            OraStoredProc1.Params.CreateParam(ftString, 'Result', ptResult);
            改为        OraStoredProc1.Params.CreateParam(ftMemo, 'Result', ptResult);
    解决问题