我寫的存盤程序在執行時順利通過了,呼叫時報缺失運算式,求大神給看看怎么回事?
create or replace procedure get_form_data(p_date varchar2,str1 varchar2,str2 varchar2,str3 varchar2,str4 varchar2,str5 varchar2)IS
t_date date;
t_dept varchar2(36);
t_identity varchar2(36);
t_charge varchar2(36);
t_operator varchar2(36);
t_type varchar2(36);
t_time varchar2(36);
t_outp number(6,2);
t_emer number(6,2);
t_daytimeoutp number(6,2);
t_daytimeemer number(6,2);
t_night number(6,2);
t_holidayoutp number(6,2);
t_holidayemer number(6,2);
t_export number(6,2);
t_regist number(6,2);
CUR1 SYS_REFCURSOR;
sql_statement varchar2(3000):='select dim_date,'||str1||','||str2||','||str3||','||str4||','||str5||',sum(t.outp_nums) OUPT_NUMS,sum(emer_nums) EMER_NUMS,
sum(daytime_outp_nums) DAYTIME_OUTP_NUMS,sum(daytime_emer_nums) DAYTIME_EMER_NUMS,
SUM(NIGHT_OUTP_NUMS) NIGHT_OUTP_NUMS,SUM(HOLIDAY_OUTP_NUMS) HOLIDAY_OUTP_NUMS,SUM(HOLIDAY_EMER_NUMS) HOLIDAY_EMER_NUMS,SUM(EXPORT_OUTP_NUMS) EXPORT_OUTP_NUMS,
SUM(REGIST_CHARGES) REGIST_CHARGES
from VDSS_CLINIC_MASTER_REC t where t.DIM_DATE=to_date('||p_date||',"yyyy/MM/dd") and rownum <=2000 group by '||str1||','||str2||','||str3||','||str4||','||str5||';';
BEGIN
delete from temp_form_data;
open CUR1 for sql_statement;
loop
fetch cur1 into t_date,t_dept,t_identity,t_charge,t_operator,t_type,t_time,t_outp,t_emer,t_daytimeoutp,t_daytimeemer,t_night,t_holidayoutp,
t_holidayemer,t_export,t_regist;
exit when CUR1%notfound;
insert into temp_form_data values(t_date,t_dept,t_identity,t_charge,t_operator,t_type,t_time,t_outp,t_emer,t_daytimeoutp,t_daytimeemer,t_night,t_holidayoutp,
t_holidayemer,t_export,t_regist);
end loop;
close CUR1;
commit;
END;
uj5u.com熱心網友回復:
報錯位置是打開游標那一行open cur1 for sql_statement 報缺失運算式
uj5u.com熱心網友回復:
你把sql_statement 的字串寫在begin后面試試,自己列印一下sql_statement 看看SQL有沒有問題uj5u.com熱心網友回復:
應該是你的SQL拼的有問題,列印出來看看吧
uj5u.com熱心網友回復:
sql沒問題的,我是測驗完寫進存盤程序的
uj5u.com熱心網友回復:
我也覺得是SQL的問題,但是單獨執行沒錯的,能幫我看看連接符有啥問題不,尤其是date轉換那塊,但是我別的連接方法都試了就這個方法編譯通過了
uj5u.com熱心網友回復:
大神在哪里,幫我看看動態sql連接符問題,我之前CALL是想看看傳空的過去能不能行,結果報缺失運算式,剛才引數寫全,給我報“”“yyyy/MM//dd”識別符號無效uj5u.com熱心網友回復:
動態SQL里的字串拼接是三個單引號,你怎么是3個雙引號,是什么鬼uj5u.com熱心網友回復:
我把傳入日期改成date型別了又報sql沒正確結束,sql反復測驗沒問題啊uj5u.com熱心網友回復:
動態SQL就能搞定了,你用游標效率可能還底點SQL> create table t(id int,nn varchar2(50));
表已創建。
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
已選擇14行。
SQL> select * from t;
未選定行
SQL> declare v_empno varchar2(50);
2 v_ename varchar2(50);
3 v_sql varchar2(1000);
4 begin
5 v_empno:='empno';
6 v_ename:='ename';
7 v_sql:='insert into t select '||v_empno||','||v_ename||' from emp where sal>2500';
8 execute immediate v_sql;
9 end;
10 /
PL/SQL 程序已成功完成。
SQL> select * from t;
ID NN
---------- --------------------------------------------------
7566 JONES
7698 BLAKE
7788 SCOTT
7839 KING
7902 FORD
uj5u.com熱心網友回復:
動態SQL就能搞定了,你用游標效率可能還底點
SQL> create table t(id int,nn varchar2(50));
表已創建。
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
已選擇14行。
SQL> select * from t;
未選定行
SQL> declare v_empno varchar2(50);
2 v_ename varchar2(50);
3 v_sql varchar2(1000);
4 begin
5 v_empno:='empno';
6 v_ename:='ename';
7 v_sql:='insert into t select '||v_empno||','||v_ename||' from emp where sal>2500';
8 execute immediate v_sql;
9 end;
10 /
PL/SQL 程序已成功完成。
SQL> select * from t;
ID NN
---------- --------------------------------------------------
7566 JONES
7698 BLAKE
7788 SCOTT
7839 KING
7902 FORD
我找到問題在哪了,動態sql一傳入日期就報錯,刪掉日期的限定就沒問題,現在我不知道怎么給日期傳值了
uj5u.com熱心網友回復:
解決了 傳值改成系結了uj5u.com熱心網友回復:
我遇到了同樣的問題,你最后怎么解決的?uj5u.com熱心網友回復:
1年的貼子了,還沒結!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/77954.html
標籤:開發
上一篇:Oracle新手求解決問題
下一篇:安裝oracle11g的時候顯示Oracle Net Configuration Assistant 失敗,手動配置netca也失敗,急
