缺失关键字

yelang 2013-12-18 08:52:02
下面是我写的一个存储过程,编译的时候没有出错,但是一执行的时候就报缺失关键字的错误,请各位大侠帮忙看一下是怎么个情况吧,谢谢了。

CREATE OR REPLACE PROCEDURE proc_test(table_name IN VARCHAR2,cjsj IN DATE,zryl IN NUMBER,jkgd IN NUMBER,zqwd IN NUMBER,zqsd IN NUMBER)AS
lzryl NUMBER(10);
ljkgd NUMBER(10);
lzqwd NUMBER(10);
lzqsd NUMBER(10);
BTime VARCHAR2(20);
ETime VARCHAR2(20);
sqlstr VARCHAR2(1000);
sqlAll VARCHAR2(1000);
BEGIN
BTime:=To_Char(Trunc(SYSDATE,'HH24'),'YYYY-MM-DD HH24:MI:SS');
ETime:=To_Char(Trunc(SYSDATE+1/24,'HH24'),'YYYY-MM-DD HH24:MI:SS');

sqlstr:='SELECT Nvl(Avg(zryl),'||To_Char(zryl)||'),Nvl(Avg(jkgd),'||To_Char(jkgd)||'),Nvl(Avg(zqwd),'||To_Char(zqwd)||'),Nvl(Avg(zqsd),'||To_Char(zqsd)||
') INTO lzryl,ljkgd,lzqwd,lzqsd FROM '||table_name||' WHERE cjsj BETWEEN To_Date('''||BTime||''',''YYYY-MM-DD HH24:MI:SS'') AND To_Date('''||ETime
||''',''YYYY-MM-DD HH24:MI:SS'')';
dbms_output.put_line(sqlstr);

EXECUTE IMMEDIATE sqlstr;
END;
/
EXECUTE proc_test('testwell_H',SYSDATE,0,0,0,0)


出错信息:
ORA-00905: 缺失关键字
ORA-06512: 在 "JKZQGD.PROC_TEST", line 22
ORA-06512: 在 line 2
...全文
478 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
_拙计 2013-12-19
  • 打赏
  • 举报
回复
咋能直接用into呢
forgetsam 2013-12-19
  • 打赏
  • 举报
回复
最基本的语法错误,具体看7楼。
CT_LXL 2013-12-18
  • 打赏
  • 举报
回复
引用 楼主 yelang 的回复:
下面是我写的一个存储过程,编译的时候没有出错,但是一执行的时候就报缺失关键字的错误,请各位大侠帮忙看一下是怎么个情况吧,谢谢了。

CREATE OR REPLACE PROCEDURE proc_test(table_name IN VARCHAR2,cjsj IN DATE,zryl IN NUMBER,jkgd IN NUMBER,zqwd IN NUMBER,zqsd IN NUMBER)AS
  lzryl NUMBER(10);
  ljkgd NUMBER(10);
  lzqwd NUMBER(10);
  lzqsd NUMBER(10);
  BTime VARCHAR2(20);
  ETime VARCHAR2(20);
  sqlstr VARCHAR2(1000);
  sqlAll VARCHAR2(1000);
BEGIN
  BTime:=To_Char(Trunc(SYSDATE,'HH24'),'YYYY-MM-DD HH24:MI:SS');
  ETime:=To_Char(Trunc(SYSDATE+1/24,'HH24'),'YYYY-MM-DD HH24:MI:SS');

  sqlstr:='SELECT Nvl(Avg(zryl),'||To_Char(zryl)||'),Nvl(Avg(jkgd),'||To_Char(jkgd)||'),Nvl(Avg(zqwd),'||To_Char(zqwd)||'),Nvl(Avg(zqsd),'||To_Char(zqsd)||
           ') INTO lzryl,ljkgd,lzqwd,lzqsd FROM '||table_name||' WHERE cjsj BETWEEN To_Date('''||BTime||''',''YYYY-MM-DD HH24:MI:SS'') AND To_Date('''||ETime
           ||''',''YYYY-MM-DD HH24:MI:SS'')';
           dbms_output.put_line(sqlstr);

  EXECUTE IMMEDIATE sqlstr;
END;
/
EXECUTE proc_test('testwell_H',SYSDATE,0,0,0,0)
出错信息: ORA-00905: 缺失关键字 ORA-06512: 在 "JKZQGD.PROC_TEST", line 22 ORA-06512: 在 line 2
错误有点多: 1.动态SQL不能用into 2.你的SQL拼接也有错,帮你改了一下能够实现你想的功能,你需要仔细看看(特别注意动态SQL是怎么改的):

CREATE OR REPLACE PROCEDURE test(table_name IN VARCHAR2,
                                 cjsj       IN DATE,
                                 zryl       IN NUMBER,
                                 jkgd       IN NUMBER,
                                 zqwd       IN NUMBER,
                                 zqsd       IN NUMBER) AS
  lzryl  NUMBER(10);
  ljkgd  NUMBER(10);
  lzqwd  NUMBER(10);
  lzqsd  NUMBER(10);
  BTime  VARCHAR2(20);
  ETime  VARCHAR2(20);
  sqlstr VARCHAR2(1000);
  sqlAll VARCHAR2(1000);
  type c_type is ref cursor;
  c1 c_type;
BEGIN
  BTime  := To_Char(Trunc(SYSDATE, 'HH24'), 'YYYY-MM-DD HH24:MI:SS');
  ETime  := To_Char(Trunc(SYSDATE + 1 / 24, 'HH24'),
                    'YYYY-MM-DD HH24:MI:SS');
  sqlstr := 'SELECT Nvl(Avg(' || zryl || '),' || To_Char(zryl) ||
            '),Nvl(Avg(' || jkgd || '),' || To_Char(jkgd) || '),Nvl(Avg(' || zqwd || '),' ||
            To_Char(zqwd) || '),Nvl(Avg(' || zqsd || '),' || To_Char(zqsd) ||
            ') FROM ' || table_name || ' WHERE to_date(' ||
            to_char(cjsj, 'yyyymmdd') ||
            ',''yyyymmdd'') BETWEEN To_Date(''' || BTime ||
            ''',''YYYY-MM-DD HH24:MI:SS'') AND To_Date(''' || ETime ||
            ''',''YYYY-MM-DD HH24:MI:SS'')';
  dbms_output.put_line(sqlstr);
  open c1 for sqlstr;
  loop
    fetch c1
      into lzryl, ljkgd, lzqwd, lzqsd;
    exit when c1%notfound;
    dbms_output.put_line(lzryl);
    dbms_output.put_line(ljkgd);
  end loop;
  close c1;
END;
/
set serverout on;
EXECUTE test('dual',SYSDATE,0,0,0,0) ;
  • 打赏
  • 举报
回复
...

--你写的
sqlstr;=select col1,col2,col3 into var1,var2,var3 from table
EXECUTE IMMEDIATE sqlstr;
--修改为
sqlstr;=select col1,col2,col3 from table
EXECUTE IMMEDIATE sqlstr into var1,var2,var3;
yelang 2013-12-18
  • 打赏
  • 举报
回复
引用 5 楼 z_shousi 的回复:
nvl(col,0)没写对

SELECT Nvl(Avg(zryl),0),Nvl(Avg(jkgd),0),Nvl(Avg(zqwd),0),Nvl(Avg(zqsd),0) INTO lzryl,ljkgd,lzqwd,lzqsd FROM testwell_H WHERE cjsj BETWEEN To_Date('2013-12-18 21:00:00','YYYY-MM-DD HH24:MI:SS') AND To_Date('2013-12-18 22:00:00','YYYY-MM-DD HH24:MI:SS')

这个就是字符串连接完成后的SQL语句,我单独执行这条查询语句的时候,报的错是一样的。缺失关键字,但是我不知道为什么,因为把这条语句放进存储过程里执行的时候就不会出错。
  • 打赏
  • 举报
回复
nvl(col,0)没写对
  • 打赏
  • 举报
回复
BTime:=To_Char(Trunc(SYSDATE,'HH24'),'YYYY-MM-DD HH24:MI:SS'); ETime:=To_Char(Trunc(SYSDATE+1/24,'HH24'),'YYYY-MM-DD HH24:MI:SS'); 是不能这么写的, 可改为:

select To_Char(Trunc(SYSDATE,'HH24'),'YYYY-MM-DD HH24:MI:SS') into BTime from dual;
select To_Char(Trunc(SYSDATE+1/24,'HH24'),'YYYY-MM-DD HH24:MI:SS') into ETimefrom dual;
yelang 2013-12-18
  • 打赏
  • 举报
回复
引用 1 楼 chenjiang89 的回复:
lz是在哪里执行的,命令窗口,还是window窗口
我在命令窗口里也执行了,同样是缺失关键字。
yelang 2013-12-18
  • 打赏
  • 举报
回复
引用 1 楼 chenjiang89 的回复:
lz是在哪里执行的,命令窗口,还是window窗口
应该算是WINDOWS窗口吧?我用了一个SQL Tools1.5的工具,不知道你用过没有。
大话EPM 2013-12-18
  • 打赏
  • 举报
回复
lz是在哪里执行的,命令窗口,还是window窗口

17,082

社区成员

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

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