晕倒,要求用delphi的ADOStoredProc调用Oralce的存储过程,可delphi报了无数次的错,怎么改都不行,各位大虾快来看看啊:
//oracle中先建个表
CREATE TABLE XG_01_Y(
EmpNo VARCHAR(4) CONSTRAINT XG_01_Y_EmpNo_pk PRIMARY KEY,
EmpName VARCHAR2(60),
Sex VARCHAR(2),
BithD VARCHAR(20),
Identifier VARCHAR(18),
JiGuan VARCHAR2(80),
Adress VARCHAR2(80),
Phone VARCHAR2(15),
Others VARCHAR2(100));//插入一行数据
Insert INTO XG_01_Y
VALUES('6','6','6','6','6','6','6','6','6');
commit;//再在oracle中建个带存储过程的包,给delphi调用;过程需要的参数由下面的Edit1,Edit2获得。但运行后,不是报游标出问题,就是参数出错,怎么回事啊,彻底绝望啦。
CREATE OR REPLACE PACKAGE PKG_TEST AS
TYPE mycur IS REF CURSOR;
PROCEDURE Emp_Select (Condition IN VARCHAR2,Condition_Value IN VARCHAR2,cur OUT mycur);
END PKG_TEST; CREATE OR REPLACE PACKAGE BODY PKG_TEST AS
PROCEDURE Emp_Select(Condition IN VARCHAR2,Condition_Value IN VARCHAR2,cur OUT mycur) IS
BEGIN
IF Condition = '编号' THEN
OPEN cur FOR
'SELECT * FROM XG_01_Y WHERE EmpNo = Condition_Value';
END IF;
END Emp_Select;
END PKG_TEST;//delphi中的代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOStoredProc1.Close;
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.ProcedureName := 'PKG_TEST.EMP_SELECT';
ADOStoredProc1.Parameters.CreateParameter('Condition',ftString,pdInput,100,Edit1.Text);
ADOStoredProc1.Parameters.CreateParameter('Condition_Value',ftString,pdInput,100,Edit2.Text);
//ADOStoredProc1.Parameters.CreateParameter('cur',ftCursor,pdOutput,0,0);
ADOStoredProc1.Open;
end;//不加游标参数的话,就提示“未找到游标上下文,(无效的游标编号)”;加上游标参数cur,又提示“不正常地定义了参数对象,提供了不一致或不完整的信息”;要么就什么结果都没有,唉,如何是好啊?//而且,我要让存储过程的结果自动显示到Dbgrid中,而不要先select into变量 ,再手动一列一列添进去,该怎么实现呢?
我用
Form1.DataSource1.dataset:=Form1.ADOStoredProc1;
Form1.DBGrid1.datasource:=Form1.DataSource1;
可是,不行啊?!
//oracle中先建个表
CREATE TABLE XG_01_Y(
EmpNo VARCHAR(4) CONSTRAINT XG_01_Y_EmpNo_pk PRIMARY KEY,
EmpName VARCHAR2(60),
Sex VARCHAR(2),
BithD VARCHAR(20),
Identifier VARCHAR(18),
JiGuan VARCHAR2(80),
Adress VARCHAR2(80),
Phone VARCHAR2(15),
Others VARCHAR2(100));//插入一行数据
Insert INTO XG_01_Y
VALUES('6','6','6','6','6','6','6','6','6');
commit;//再在oracle中建个带存储过程的包,给delphi调用;过程需要的参数由下面的Edit1,Edit2获得。但运行后,不是报游标出问题,就是参数出错,怎么回事啊,彻底绝望啦。
CREATE OR REPLACE PACKAGE PKG_TEST AS
TYPE mycur IS REF CURSOR;
PROCEDURE Emp_Select (Condition IN VARCHAR2,Condition_Value IN VARCHAR2,cur OUT mycur);
END PKG_TEST; CREATE OR REPLACE PACKAGE BODY PKG_TEST AS
PROCEDURE Emp_Select(Condition IN VARCHAR2,Condition_Value IN VARCHAR2,cur OUT mycur) IS
BEGIN
IF Condition = '编号' THEN
OPEN cur FOR
'SELECT * FROM XG_01_Y WHERE EmpNo = Condition_Value';
END IF;
END Emp_Select;
END PKG_TEST;//delphi中的代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOStoredProc1.Close;
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.ProcedureName := 'PKG_TEST.EMP_SELECT';
ADOStoredProc1.Parameters.CreateParameter('Condition',ftString,pdInput,100,Edit1.Text);
ADOStoredProc1.Parameters.CreateParameter('Condition_Value',ftString,pdInput,100,Edit2.Text);
//ADOStoredProc1.Parameters.CreateParameter('cur',ftCursor,pdOutput,0,0);
ADOStoredProc1.Open;
end;//不加游标参数的话,就提示“未找到游标上下文,(无效的游标编号)”;加上游标参数cur,又提示“不正常地定义了参数对象,提供了不一致或不完整的信息”;要么就什么结果都没有,唉,如何是好啊?//而且,我要让存储过程的结果自动显示到Dbgrid中,而不要先select into变量 ,再手动一列一列添进去,该怎么实现呢?
我用
Form1.DataSource1.dataset:=Form1.ADOStoredProc1;
Form1.DBGrid1.datasource:=Form1.DataSource1;
可是,不行啊?!
2、delphi的问题还是放在delphi版吧。