首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

缺失关键字解决方案

2013-12-20 
缺失关键字下面是我写的一个存储过程,编译的时候没有出错,但是一执行的时候就报缺失关键字的错误,请各位大

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


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

[解决办法]
...


--你写的
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;

[解决办法]
引用:
下面是我写的一个存储过程,编译的时候没有出错,但是一执行的时候就报缺失关键字的错误,请各位大侠帮忙看一下是怎么个情况吧,谢谢了。

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) ;


[解决办法]
最基本的语法错误,具体看7楼。


[解决办法]
咋能直接用into呢

热点排行