这究竟是delphi的问题还是oracle的问题啊?(100分)

  • 主题发起人 主题发起人 lailai
  • 开始时间 开始时间
L

lailai

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在delphi中编写oracle中的过程,却碰到了一个问题:
例如我有一张很简单的表a,only一个字段,
number型。
我在adoquery.sql.add中直接加入
create or replace procedure adda(
n1 in number)
as
begin
insert into a values(n1);
end;
此时运行时不会出错,过程顺利建成。
但是我一加入out型参数:
create or replace procedure adda(
n1 in number,
n2 out varchar2)
as
begin
insert into a values(n1);
n2:='成功了';
dbms_output.put_line(n2);
end;
现在运行就出错了,呜呜。
delphi说:应用程序定义parameter对象的方式不适当。
为什么啊? (oracle8.05)
 
out是为了返回值用的
 
to: lailai
  打搅一下:请问你的ADOConnection是怎么连接连接到Oracle的?我怎么总是连不上。
可以麻烦你把ConnectionString拷贝到这里来一下吗。谢谢了。
 
这应该是你自己的问题吧 :)
可能把Parameters[1]的Direction改为pdOutput就行了。

ConnectionString:
Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=scott;Data Source=oracle
 
连接ORACLE还是用TQUERY好,使用ADO连接ORACLE我已经吃足苦头了。
 
大家好,我现在的问题是这样。我需要编写一个这样的程序,在delphi中为

oracle动态的建立表,同时为建好的这张表编写一个过程,这个过程能够为
这张表添加纪录,并且能够提供一个返回值,表示增加成功或者失败。现在
的问题是在delphi中编译时只有输入参数时就可以,但是加入一个输出参数后就

出错了。到底要怎么写呢?可是在oracle的sql/plus中那样写确实是可以的呀!

to xianjun:
这些参数应该是过程中的参数吧,不是adoquery中的参数吧,写好的过程我是
准备使用adostoredproc调用的,使用adostoredproc调用时这些in out 参数会
自动激活的。

to bpearl:

xianjun已经回答了,应该没什么问题的。odbc设定好就行了。

to caili314:
现在是骑虎难下了,sigh
 
为何不用function呢,奇怪了?function可以返回值的啊
 
由于以前没试过用ADO连ORACLE, 所以帮你试了一下:
create or replace procedure TestProc(p_In in varchar2, p_Out out varchar2) is
begin
p_Out := p_In;
end;

with ADOQuery1 do
begin
SQL.Text := 'begin TestProc(:In, :Out); end;';
Parameters[0].Value := 'asdfasdf';
Parameters[1].Direction := pdOutput; //不会自动改为pdOutput?
Parameters[1].Value := '####'; //相当于是为Output分配内存,即此中输入4个字符,输出也是4个字符! FAINT!
ExecSQL;
ShowMessage(Parameters[1].Value);
end;
 
xianjun,谢谢你,你告诉我了如何使用adoquery调用oracle的过程,其实调用过程直接用
adostoredproc更好一些,它会自动判断参数类型:
with adostoredproc1 do
begin
ProcedureName:='testproc';
Parameters.Refresh;
Parameters[0].Value:='asdfasdf';
ExecProc;
showmessage(adostoredproc1.Parameters[1].Value);
end;
不过,大哥,你的过程是在oracle底下做的吧,我的问题是怎么在delphi下创建过程,
就是说能不能with ADOQuery1 do
begin
SQL.Text :='create or replace procedure TestProc(p_In in varchar2, p_Out out varchar2) is
begin
p_Out := p_In;
end;'
ExecSQL;(当然,现在我知道,直接这样是不行的)
请恕小弟愚钝,望大哥赐教!!
 
现在问题稍有进展,如果我把n2:='成功了'这句话删掉,就是说在过程中我不给n2赋值,程序如下:
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('create or replace procedure adda(');
adoquery1.SQL.Add('n1 in number,');
adoquery1.SQL.Add('n2 out varchar2)as');
adoquery1.SQL.Add('begin');
adoquery1.SQL.Add('insert into a values(n1);');
adoquery1.SQL.Add('end;');
adoquery1.ExecSQL;
如果是这样,程序可以执行,过程也建立起来了,
但是如果是:
var
s:string;
begin
s:='成功了';
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('create or replace procedure adda(');
adoquery1.SQL.Add('n1 in number,');
adoquery1.SQL.Add('n2 out string)as');
adoquery1.SQL.Add('begin');
adoquery1.SQL.Add('insert into a values(n1);');
adoquery1.SQL.Add('n2:=');
adoquery1.SQL.Add(s);
adoquery1.SQL.Add('end;');
adoquery1.ExecSQL;
就会出错。出错信息是:Parameter对象被不正确的定义,提供了不一致或不完整的信息。
看起来就是n2:='成功了'这句话错了。是不是类型不匹配呢?varchar2在delphi中对应的是什么类型呢?如果要给n2赋值要这么写?高手们请指教!
先谢谢大家了!
 
汉字是等宽字符,参数应该选用ftVariant类型。
 
lailai,我调试成功了,看你哪点错了,
1、存储过程一样。
2、在DELPHI中用TStoredProc,参数n1 DataType=ftInteger,Paramtype=ptInput,
参数n2 DataType=ftString,Paramtype=ptOutput
3、调用存储过程如下:
Var
ii:integer;
begin
StoredProc1.close;
StoredProc1.ParamByName('nn').asinteger:=1;
StoredProc1.ExecProc;
ii:=StoredProc1.ParamByName('iout').asstring;
showmessage(ii);
end;

至于用ADO连ORACLE,因ADO并没有找到ORACLE动态连接库,在目前,要开发ORACLE最好用BDE,
要不然,害死你
 
不知怎么搞的, 昨天一整天都连不上来!
其实创建过程也是执行一句(段)SQL语句而已。 如下:
with ADOQuery1 do
begin
ParamCheck := False; //把自动检测参数去掉,否则ADOQuery将产生一个名为'='的变量
SQL.Clear;
SQL.Add('create or replace procedure testproc(p_in in varchar2, p_out out varchar2) is');
SQL.Add('begin');
SQL.Add(' p_out := p_in;');
SQL.Add('end;');
ExecSQL;
end;

加了赋值语句即出错也是因为没把ParamCheck设为False。
 
to xianjun:
真是太谢谢你了,我现在搞定了。代码如下:
with ADOQuery1 do
begin
ParamCheck := False; //看来这句很关键。
SQL.Clear;
SQL.Add('create or replace procedure adda(n1 in varchar2, n2 out varchar2) is');
SQL.Add('begin');
SQL.Add('insert into a values(n1);');
SQL.Add('n2:=''成功了'';');
SQL.Add('end;');
ExecSQL;

to zsp:
没办法,我用ado是迫不得已。好在有众位大哥鼎立相助,真是太感谢了

to all:
真是谢谢大家了,本来我自己都已放弃,大家那么热心的帮助我,谢谢了!
可是我只有100分,xianjun对我的帮助最大,我想把这100分都给他,以表达我的
感谢心情。谢谢!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
2K
import
I
后退
顶部