oracel函数问题 (50分)

  • 主题发起人 主题发起人 ideafrog
  • 开始时间 开始时间
I

ideafrog

Unregistered / Unconfirmed
GUEST, unregistred user!
我在执行oracle的函数,用ado在delphi中
提示
  identifier is too long。

在sql*plus中执行
select "P_WBJK_GET_ZSXM_SSSQ('510602205079776','N','01', to_date('2002/06/01','yyyy/mm/dd'),
to_Date('2002/06/30','yyyy/mm/dd')) as F_result" from dual;
同样的提示。
用如下的语句
select P_WBJK_GET_ZSXM_SSSQ('510602205079776','N','01', to_date('2002/06/01','yyyy/mm/dd'),
to_Date('2002/06/30','yyyy/mm/dd')) as F_result from dual;

提示非法字符

请教到底是怎么回事?

 
你是在调一个存储过程吗?我怎么没有见过这种语法呀!!
你写在了""之中,可不就是标志符过长嘛
要取存储过程的返回值,你可以用一段匿名的pl/sql块来执行
另外,别名不用加as,那不是oracle的语法吧
如 select sysdate today from dual;
 
为什么不用adostoredproc?
你需要的不就是存储过程的返回值吗?
 
  我在delphi中是用adostoredproc的
但是出现了那个问题,我才到sql*plus试试的。
to Walone:
as是oracle的语法;
  我把双引号去掉,就变成了非法字符了。加双引号是别人告诉我的,我对oracle
不太懂。
  现在主要的问题还是,为什么在delphi中会出现标志府太长的提示,竟然跟加
引号的提示一样。
  
 
提示非法字符,你没发现as居然是全角的字符,不是半角的?
 
第一句你用双引号,开头的也是全角的双引号,而且用双引号,表示双引号内的一个整体是一个id
你最多只能用双引号包围 "P_WBJK_GET_ZSXM_SSSQ" 而已
 
不是的,我写的有问题

实际是半角的
 
sqlplus中执行会有星号指示哪个地方出错的,他提示什么地方非法字符?
 
我用
 select P_WBJK_GET_ZSXM_SSSQ('510602205079776','N','01',to_date('2002/06/01',
'yyyy/mm/dd'),to_date('2002/06/30','yyyy/mm/dd')) from dual;

ERROR at line 1:
ORA-00911: invalid character
 
1、在程序中最后的分号是不用的,只是sqlplus需要最后的分号
2、把命令中的空格删掉,重新输入空格一次(如果是拷贝来的命令,怕有非法字符(特别是pdf拷贝来的,最多不可见的非法字符))
 
1、呵呵在DELPHI程序是不用分号来执行一个语句的,ORACLE需要
2、去掉AS
 
to pipi:
语句是在sql*plus中执行的,在delphi中是用adostoredproc的,只是发现出了
 异常,提示标识符太长。我不知道原因,才拿到sql*plus中想执行,找找原因。
 可是没有执行成功过,就想上面描述的,不是提示标识符太长,就是非法字符。
 你说的我都没有用还是老样子!
我很急,大家帮帮忙:
① 在delphi中是什么原因导致标识符太长。
② 在sql*plus中为什么会提示非法字符。  

 
不知道你在adostoredproc中是怎么应用的?
你根本就不需要写这样的语句,你将参数设定好,直接运行就可以了,然后取得返回结果,
不就是你想要的内容吗?
在sqlplus中,直接按如下方式执行:
exec P_WBJK_GET_ZSXM_SSSQ('510602205079776','N','01',
to_date('2002/06/01','yyyy/mm/dd'),to_Date('2002/06/30','yyyy/mm/dd'));
 
to armyjiang, :
① 我是这样用的:
 with FStoPro do
begin
close;
parameters.Clear;
Connection :=FGsjConn;
prepared :=False;
procedurename := 'P_WBJK_GET_ZSXM_SSSQ';
Parameters.CreateParameter('return_value',ftinteger,pdReturnValue,5,0);
Parameters.CreateParameter('@as_nsrsbh',ftstring,pdInput,20,'');
//input,---纳税人识别号
Parameters.CreateParameter('@as_wtdz',ftstring,pdInput,1,'');
//input,---委托待征标志
Parameters.CreateParameter('@as_zsxm',ftstring,pdInput,2,'');
//input,---征收项目
Parameters.CreateParameter('@adt_sssq_q',ftDateTime,pdInput,10,0);
//input, ---所属时期始
Parameters.CreateParameter('@adt_sssq_z',ftDateTime,pdInput,10,0);
//input,---所属时期终
    ..... //output
Parameters.ParamValues['@as_nsrsbh'] := ansdjh; //字符
Parameters.ParamValues['@adt_sssq_q'] :=FSssq_s; //date
Parameters.ParamValues['@adt_sssq_z'] :=FSssq_z;//date
Parameters.ParamValues['@as_zsxm'] :=aSzbm; //字符
Parameters.ParamValues['@as_wtdz'] :='N';  
prepared :=True;
ExecProc;
在执行中发现,提示标识符太长。
经试验,当有返回数据时提示出错,如果取不到返回数据时,能够成功返回200(表示无数据)

② 直接执行怎么提示
ERROR at line 1:
ORA-00900: invalid SQL statement
 
在做和CTAIS的接口?
如果可能,把有关的资料发给我,我帮你测试一下,你只给一个错误号没有用!
另外,你的存储过程输入参数有无缺省值,如果有的话,在测试存储过程时,从最少的
输入参数开始测试起!
 
to armyjiang:
 是在做ctais的接口,只是我无法把资料给你。东西太多了,上百兆的。
真实的环境我自己也没有,我是在用没有数据的ctais库在测,过程可以执行
只是返回200的。但是在用户那边(同事在那里)。
因为ctais中有数据,就出来那个标识符太长的提示!
  我真不知道怎么办了,有没有可能是返回参数出了什么问题?

另: 在sqlplus中,怎么去执行函数啊,我用
exec P_WBJK_GET_ZSXM_SSSQ('510602205079776','N','01', to_date('2002/06/01','yyyy/mm/dd'),
to_Date('2002/06/30','yyyy/mm/dd'))
提示:
ERROR at line 1:
ORA-00900: invalid SQL statement


 
好不好先用一个静态的输入值来测试啦?
别动态创建所关参数列表。
算了,不好使!
你得想办法先在SQLPLUS下将存储过程测试通过才行。
 
1、 oracle的参数不是用@号的,那是sqlserver的
2、 sqlplus执行函数,比如,返回值是number的话
var a number
exec :a:=函数(......)
print 看到a 的值
 
to pipi:
其他的存储过程我就是这样调用成功的,就是这个不行
 
那 P_WBJK_GET_ZSXM_SSSQ 贴出来看看?
 
后退
顶部