说:有12张表,table01到table12。按月查表格,规则如下:例3月份查table02,4月份查table03类推。
每个表都有字段5个:字段1,字段2,字段3,字段4,字段5,用存储过程怎么写呢?
CREATE OR REPLACE PROCEDURE "test1"
(
vo_resultcode OUT NUMBER ,
vo_resultinfo OUT VARCHAR2
)
IS
字段1 VARCHAR2(30);
字段2 VARCHAR2(30);
字段3 VARCHAR2(30);
字段4 VARCHAR2(30);
字段5 VARCHAR2(30);
v_sql VARCHAR2(1500);
BEGIN
v_sql := ‘SELECT * FROM TABLE’||TO_CHAR(sysdate,‘MM’);
EXECUTE IMMEDIATE v_sql INTO 字段1,字段2,字段3,字段4,字段5;请高手帮我看看有没有错呢?谢谢啦,新手求指导。
每个表都有字段5个:字段1,字段2,字段3,字段4,字段5,用存储过程怎么写呢?
CREATE OR REPLACE PROCEDURE "test1"
(
vo_resultcode OUT NUMBER ,
vo_resultinfo OUT VARCHAR2
)
IS
字段1 VARCHAR2(30);
字段2 VARCHAR2(30);
字段3 VARCHAR2(30);
字段4 VARCHAR2(30);
字段5 VARCHAR2(30);
v_sql VARCHAR2(1500);
BEGIN
v_sql := ‘SELECT * FROM TABLE’||TO_CHAR(sysdate,‘MM’);
EXECUTE IMMEDIATE v_sql INTO 字段1,字段2,字段3,字段4,字段5;请高手帮我看看有没有错呢?谢谢啦,新手求指导。
v_sql := 'SELECT * FROM TABLE' || TO_CHAR(sysdate,'MM') ||
'INTO 字段1, 字段2, 字段3, 字段4, 字段5';
CREATE OR REPLACE PROCEDURE "zengzhi_xingweimingxi_yi"
(
vo_resultcode OUT NUMBER,
vo_resultinfo OUT VARCHAR2
)
IS
START_DATE VARCHAR2(8);
MSISDN VARCHAR2(15);
OTHER_PARTY VARCHAR2(30);
CALL_TYPE VARCHAR2(2);
START_TIME VARCHAR2(20);
END_TIME VARCHAR2(20);
CALL_DURATION INTEGER;
v_sql VARCHAR2(1500);
BEGIN
v_sql:='SELECT START_DATE,MSISDN,OTHER_PARTY,CALL_TYPE,to_char(TO_DATE(START_DATE||'' ''||START_TIME,''yyyymmdd hh24miss''),''yyyymmdd hh24miss'')
,to_char(TO_DATE(START_DATE||'' ''||START_TIME,''yyyymmdd hh24miss'') + CALL_DURATION / 24 / 60 / 60,''yyyymmddhh24miss''),CALL_DURATION FROM TG_CDR'
||to_char(add_months(sysdate,-1),'mm');
EXECUTE IMMEDIATE v_sql INTO START_DATE,MSISDN,OTHER_PARTY,CALL_TYPE,START_TIME,END_TIME,CALL_DURATION;END;我是按别人修改的,用toad运行时候报“OUT is not a valid INTEGER"错误,请问那个
vo_resultcode OUT NUMBER,
vo_resultinfo OUT VARCHAR2这两句是在说系统的结果返回吗??不明白是做什么的啊?
DECLARE
v_val PDS.TBIWDENUM.VAL%TYPE; //获得PDS.TBIWDENUM表中的VAL列的类型信息,并定义变量v_val为该类型
v_valen PDS.TBIWDENUM.VALEN%TYPE;
CURSOR c_Infor IS //定义游标指向查询结果集
SELECT VAL,VALEN
FROM PDS.TBIWDENUM
WHERE PARAMETERTYPE =14;
BEGIN
OPEN c_Infor; //打开游标
LOOP //开始循环取结果集中的数据
FETCH c_Infor INTO v_val,v_valen; //取游标指向结果集中的一行记录,并将游标指针指向下一行
EXIT WHEN c_Infor%NOTFOUND; //判断当前取回的行内容为空
IF v_val = 64 THEN //判断数据条件,满足则输出相应信息
DBMS_OUTPUT.put_line(v_val);
DBMS_OUTPUT.put_line(v_valen);
DBMS_OUTPUT.put_line('Find it');
END IF;
END LOOP;
CLOSE c_Infor; //关闭游标,释放资源
END;
显示游标仅仅是用来控制返回多行的SELECT语句,而隐式游标是指向处理所有的SQL语句的环境区域的指针,隐式游标也叫SQL游标。
SQL游标用来处理INSERT、UPDATE、DELETE以及返回一行的SELECT……INTO语句。一个SQL游标不管是打开还是关闭,OPEN、FETCH和CLOSE命令都不能操作。
游标类型变量使用代码分析
DECLARE
TYPE t_CurRef IS REF CURSOR; //定义一个引用游标类型,但是并没有固定到某一类型上
c_CursorRef t_CurRef; //定义一个引用游标类型的游标变量 TYPE t_ValenRef IS RECORD( //定义一个用户需要的记录集类型
Parameter PDS.TBIWDENUM.PARAMETERTYPE%TYPE,
valen PDS.TBIWDENUM.VALEN%TYPE);
TYPE t_ValRef IS RECORD( //定义一个用户自己的记录集类型
Parameter PDS.TBIWDENUM.PARAMETERTYPE%TYPE,
val PDS.TBIWDENUM.VAL%TYPE);
v_Valen t_ValenRef; //根据用户定义的记录集类型定义记录集变量
v_Val t_ValRef;
BEGIN
OPEN c_CursorRef FOR //打开游标,并指向查询结果为t_ValenRef类型的记录集
SELECT PARAMETERTYPE,VALEN FROM PDS.TBIWDENUM WHERE PARAMETERTYPE =14;
LOOP
FETCH c_CursorRef INTO v_Valen; //获取记录集中的一行数据
EXIT WHEN c_CursorRef%NOTFOUND;
DBMS_OUTPUT.put_line(v_valen.Parameter);
END LOOP;
CLOSE c_CursorRef;
OPEN c_CursorRef FOR //打开游标,并指向查询结果为t_ValRef类型的记录集
SELECT PARAMETERTYPE,VAL FROM PDS.TBIWDENUM WHERE PARAMETERTYPE =14;
LOOP
FETCH c_CursorRef INTO v_Val;
EXIT WHEN c_CursorRef%NOTFOUND;
DBMS_OUTPUT.put_line(v_Val.val);
END LOOP;
CLOSE c_CursorRef;
END;
(
vo_resultcode OUT NUMBER ,
vo_resultinfo OUT VARCHAR2
)
as
sMonth varchar2(4);
sPrvMonth varchar2(4);
sSearchTbl varchar2(30);
sSql varchar2(2000);
v_a1 varchar2(30);
v_a2 varchar2(30);
v_a3 varchar2(30);
v_a4 varchar2(30);
v_a5 varchar2(30);
begin
vo_resultinfo := '取出当前服务器时间的月份';
select to_char(sysdate,'mm') into sMonth from dual;
vo_resultinfo := '获取当前月份的上一个月';
if to_number(sMonth) = 1 then
sPrvMonth := '12';
else
if to_number(sMonth) > 10 then
sPrvMonth := to_Char(to_number(sMonth)-1);
else
sPrvMonth := '0'||to_Char(to_number(sMonth)-1);
end if;
end if;
vo_resultinfo := '获取当前月要查询的数据表名';
sSearchTbl := 'table'||sPrvMonth;
vo_resultinfo := '获取数据';
sSql := 'begin
select a1,a2,a3,a4,a5 into :1,:2,:3,:4,:5 from '||sSearchTbl||';
end;';
execute immediate sSql using out v_a1,v_a2,v_a3,v_a4,v_a5; --后面的操作LZ没明确指时要做什么。当然这个我也没进行测试 vo_resultcode := 1;
vo_resultinfo := '成功';
exception
when others then
vo_resultinfo := 'Error';
vo_resultcode := 0;
end;
create or replace procedure test
(
vo_resultcode OUT NUMBER ,
vo_resultinfo OUT VARCHAR2
)
as
sMonth varchar2(4);
sPrvMonth varchar2(4);
sSearchTbl varchar2(30);
sSql varchar2(2000);
v_a1 varchar2(30);
v_a2 varchar2(30);
v_a3 varchar2(30);
v_a4 varchar2(30);
v_a5 varchar2(30);
begin
vo_resultinfo := '取出当前服务器时间的月份';
select to_char(sysdate,'mm') into sMonth from dual;
vo_resultinfo := '获取当前月份的上一个月';
if to_number(sMonth) = 1 then
sPrvMonth := '12';
else
if to_number(sMonth) > 10 then
sPrvMonth := to_Char(to_number(sMonth)-1);
else
sPrvMonth := '0'||to_Char(to_number(sMonth)-1);
end if;
end if;
vo_resultinfo := '获取当前月要查询的数据表名';
sSearchTbl := 'table'||sPrvMonth;
vo_resultinfo := '获取数据';
sSql := 'begin
select a1,a2,a3,a4,a5 into :1,:2,:3,:4,:5 from '||sSearchTbl||';
end;';
execute immediate sSql using out v_a1,out v_a2,out v_a3,out v_a4,out v_a5; --后面的操作LZ没明确指时要做什么。当然这个我也没进行测试 vo_resultcode := 1;
vo_resultinfo := '成功';
exception
when others then
vo_resultinfo := 'Error';
vo_resultcode := 0;
end;