oracle 存储过程调用报错。。。无效列名。。

dy942 2008-04-21 04:15:56
create or replace procedure BILLDATE_PROC
(
strdate VARCHAR2,
strenddate VARCHAR2,
strBiz VARCHAR2
)
AS
BEGIN
EXECUTE IMMEDIATE 'create table TESTONESTR as(select ''20080401-20080417'' 日期,
(select propertyvalue from machineinfo where propertycode=''20'' and
macid=PAYMENTINFO.MACID) 营业厅, (select machinecode from machineindex
where macid=PAYMENTINFO.MACID) 设备编号,(select selectitemname from
dropdownlist where ddlname=''缴费状态'' and selectitemvalue=PAYSTATE)
缴费状态,count(PAYMONEY) 交易笔数, sum(PAYMONEY) 交易金额 from PAYMENTINFO
where (PAYMENTINFO.PAYDATETIME between to_date('||strdate||',''yyyymmdd'') and
to_date('||strenddate||',''yyyymmdd'')) and PAYMENTINFO.MACID in (select macid from
machineinfo where PropertyCode=''20'' and propertyvalue='||strBiz||')
group by PAYMENTINFO.MACID,PAYMENTINFO.PAYSTATE) order by 营业厅,设备编号,缴费状态';
END;

这是我写的存储过程,我写execute BILLDATE_PROC('20080415','20080415','芙蓉区营业厅'); 调用
但是报错


*
ERROR 位于第 1 行:
ORA-00904: 无效列名
ORA-06512: 在"USERNAME.BILLDATE_PROC", line 9
ORA-06512: 在line 1


有哪位高手知道啥原因不,我把SQL语句独立出来是可以运行的。。
...全文
315 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dy942 2008-04-23
  • 打赏
  • 举报
回复
换了种方法 问题已解决~ 谢谢大家
dy942 2008-04-22
  • 打赏
  • 举报
回复
刚又发现把propertyvalue=' ¦ ¦strBiz ¦ ¦' 这里改成两个单引号 PropertyValue=''||strBiz||''
就可以执行成功了,但是查不出数据,我想两个双引号应该是变成这样 ‘芙蓉区营业厅’ 然后跟数据库的去匹配
所以匹配不上,有没有哪个高手可以解答啊。。。。
为什么我前面两个参数都能用,这里就不行呢?
dy942 2008-04-22
  • 打赏
  • 举报
回复
我试了下 adaizi1980 的方法
declare
i number;
begin
BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
end;
我在执行这段代码的时候编译就通不过,还是报 无效列名的错误,
但是我把存储过程修改了一下,propertyvalue=' ¦ ¦strBiz ¦ ¦')这里
不传参数,直接写成propertyvalue=''芙蓉区营业厅''这样就可以了,
郁闷,不知道是什么原因
adaizi1980 2008-04-22
  • 打赏
  • 举报
回复
是你的动态sql写的有问题,应该是某个字段名不存在或写错了,按如下方式调试:

先按这样修改过程:
create or replace procedure BILLDATE_PROC
(
strdate VARCHAR2,
strenddate VARCHAR2,
strBiz VARCHAR2
)
AS
var_sql varchar2(8000);
BEGIN
var_sql := 'create table TESTONESTR as(select ''20080401-20080417'' 日期,
(select propertyvalue from machineinfo where propertycode=''20'' and
macid=PAYMENTINFO.MACID) 营业厅, (select machinecode from machineindex
where macid=PAYMENTINFO.MACID) 设备编号,(select selectitemname from
dropdownlist where ddlname=''缴费状态'' and selectitemvalue=PAYSTATE)
缴费状态,count(PAYMONEY) 交易笔数, sum(PAYMONEY) 交易金额 from PAYMENTINFO
where (PAYMENTINFO.PAYDATETIME between to_date(' ¦ ¦strdate ¦ ¦',''yyyymmdd'') and
to_date(' ¦ ¦strenddate ¦ ¦',''yyyymmdd'')) and PAYMENTINFO.MACID in (select macid from
machineinfo where PropertyCode=''20'' and propertyvalue=' ¦ ¦strBiz ¦ ¦')
group by PAYMENTINFO.MACID,PAYMENTINFO.PAYSTATE) order by 营业厅,设备编号,缴费状态';
dbms_output.put_line(trim(var_sql));
--EXECUTE IMMEDIATE var_sql;
END;
拿到testwindow去测试:
declare
i number;
begin
BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
end;
查看testwindow的dbms output区里的sql语句,将其copy到sqlwindow去执行一下,看报哪个字段不存在的错误,修正那个字段名后再执行就可以了
adaizi1980 2008-04-22
  • 打赏
  • 举报
回复
严格按照我在6楼说的做一遍,注意,必须用我给你改了以后的过程而不能直接用你自己的过程;
然后发跟踪到的sql语句,即var_sql的值上来
dy942 2008-04-22
  • 打赏
  • 举报
回复
不太明白。。。能不能说的详细点。。?
adaizi1980 2008-04-22
  • 打赏
  • 举报
回复
注意要修改你的存储过程,在存储过程里要做成只输出sql语句而不执行sql语句,然后看你输出的sql语句是否有问题;
单纯执行
declare
i number;
begin
BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
end;
是没用的

另:注意引号的用法,举例如下
SQL> select '''' from dual;

''''
----
'

SQL> select ',''' from dual;

','''
-----
,'

SQL> select '''a'',' from dual;

'''A'','
--------
'a',

SQL> select ''||'a'||',' from dual;

''||'A'||','
------------
a,

SQL>
dy942 2008-04-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guo0399 的回复:]
要在SQL\Plus里面运行execute BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
或者在PL\SQL的Command模式运行execute BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
[/Quote]

我是在SQL/PLUS里面运行的。。。
dy942 2008-04-21
  • 打赏
  • 举报
回复
试了英文,还是一样的

*
ERROR 位于第 1 行:
ORA-00904: 无效列名
ORA-06512: 在"USERNAME.BILLDATE_PROC", line 9
ORA-06512: 在line 1
guo0399 2008-04-21
  • 打赏
  • 举报
回复
要在SQL\Plus里面运行execute BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
或者在PL\SQL的Command模式运行execute BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
Petergepeter 2008-04-21
  • 打赏
  • 举报
回复
可能是中文的问题,试试E文。

17,137

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧