Oracle 执行immediate语句以使用游标中的变量创建视图
我使用以下代码成功编译,但测试时出现错误:Oracle 执行immediate语句以使用游标中的变量创建视图,oracle,plsql,Oracle,Plsql,我使用以下代码成功编译,但测试时出现错误: “ORA-00904”“VTX\U HR”无效标识符。 因为我是PLSQL的初学者,所以我不太确定我是否可以这样做: create or replace procedure bal_table As V_Mondol number; V_Emplid varchar2(7); V_Monhr number; V_name varchar2(50); V_erncd varchar2(3); V_Grsdo
“ORA-00904”“VTX\U HR”无效标识符。
因为我是PLSQL的初学者,所以我不太确定我是否可以这样做:
create or replace procedure bal_table
As
V_Mondol number;
V_Emplid varchar2(7);
V_Monhr number;
V_name varchar2(50);
V_erncd varchar2(3);
V_Grsdol number;
V_Grshr number;
VFX_dol number;
VFX_hr number;
VSX_dol number;
VSX_hr number;
VTX_dol number;
VTX_hr number;
--V_cursor SYS_RefCursor;
--V_glapre varchar2(3);
--V_reghr varchar2(1);
A_Cursor Sys_refcursor;
-- v_page_record A_cursor%ROWTYPE;
Mmonth number(2):= to_number(to_char(sysdate, 'mm'));
Mdate number(2) := to_number(to_char(sysdate, 'dd'));
Mnum number(2);
Begin
if Mdate<26 then Mnum := Mmonth -1;
if mnum<1 then mnum :=12;
End If;
Else
Mnum := Mmonth;
End If;
CASE MNUM
when 1 then
Open A_cursor
FOR SELECT emplid,name,erncd,Jan_dol as mon_dol,jan_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 2 then
Open A_cursor
FOR SELECT emplid,name,erncd,Feb_dol as mon_dol,Feb_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 3 then
Open A_cursor
FOR SELECT emplid,name,erncd,Mar_dol as mon_dol,Mar_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 4 then
Open A_cursor
FOR SELECT emplid,name,erncd,apr_dol as mon_dol,apr_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 5 then
Open A_cursor
FOR SELECT emplid,name,erncd,May_dol as mon_dol,May_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 6 then
Open A_cursor
FOR SELECT emplid,name,erncd,jun_dol as mon_dol,jun_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 7 then
Open A_cursor
FOR SELECT emplid,name,erncd,jul_dol as mon_dol,jul_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 8 then
Open A_cursor
FOR SELECT emplid,name,erncd,aug_dol as mon_dol,aug_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 9 then
Open A_cursor
FOR SELECT emplid,name,erncd,sep_dol as mon_dol,sep_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 10 then
Open A_cursor
FOR SELECT emplid,name,erncd,oct_dol as mon_dol,oct_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 11 then
Open A_cursor
FOR SELECT emplid,name,erncd,nov_dol as mon_dol,nov_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
when 12 then
Open A_cursor
FOR SELECT emplid,name,erncd,dec_dol as mon_dol,dec_hr as mon_hr,grs_dol,grs_hr,fx_dol,fx_hr,sx_dol,sx_hr,tx_dol,tx_hr
into V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr
FROM earnbal where emplid='abc';
END CASE;
LOOP
FETCH A_cursor INTO V_emplid,V_name,V_erncd,V_mondol,V_monhr,V_Grsdol,V_Grshr,VFX_dol,VFX_hr,VSX_dol,VSX_hr,VTX_dol,VTX_hr;
EXIT WHEN A_Cursor%NOTFOUND;
End loop;
-- Execute Immediate 'create or replace view moe as select A_CURSOR.v_emplid,A_CURSOR.V_NAME,A_CURSOR.V_ERNCD,A_CURSOR.V_MONDOL,
-- A_CURSOR.V_MONHR,A_CURSOR.V_GRSDOL,A_CURSOR.V_GRSHR,A_CURSOR.VFX_DOL,A_CURSOR.VFX_HR,A_CURSOR.VSX_DOL,A_CURSOR.VSX_HR,
-- A_CURSOR.VTX_DOL,A_CURSOR.VTX_HR FROM EARNBAL';
Execute Immediate 'create table moe as select v_emplid,V_NAME,V_ERNCD,V_MONDOL,
V_MONHR,V_GRSDOL,V_GRSHR,VFX_DOL,VFX_HR,VSX_DOL,VSX_HR,
VTX_DOL,VTX_HR FROM EARNBAL ';
COMMIT;
-- DBMS_OUTPUT.PUT_LINE('The employee='||V_Emplid||' '||V_name||' '||V_erncd||' '||V_Mondol||' '|| V_Monhr);
-- End Loop;
End bal_table;
创建或替换程序平衡表
作为
V_Mondol编号;
V_Emplid varchar2(7);
V_Monhr编号;
V_name varchar2(50);
瓦查尔2(3);
V_Grsdol编号;
V_Grshr编号;
VFX_-dol数;
VFX_hr编号;
VSX_dol编号;
VSX_hr编号;
VTX_dol编号;
VTX_人力资源编号;
--V_光标系统_参考光标;
--V_glapre varchar2(3);
--V_reghr varchar2(1);
A_游标Sys_refcursor;
--v_page_记录光标%ROWTYPE;
第(2)个数字:to_数字(to_字符(sysdate,'mm'));
Mdate编号(2):=to_编号(to_char(sysdate,'dd'));
Mnum数(2);
开始
如果Mdate问题出现在executeimmediate语句中,那么应该用这种方式替换它(将值而不是变量名传递给应该执行的字符串)。(即使我没有得到逻辑,为什么要从现有表中选择这些变量,而不从该表中选择任何变量)
我没有通读所有的数据类型,但别忘了像这样在引号中加上varchar
||','''||V_NAME||''',
||','''||V_NAME||''',