ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle专题深入讨论 » 如何在存储过程中变量传递表名,在cursor中调用?

标题: 如何在存储过程中变量传递表名,在cursor中调用?
离线 Arrayyuxuan
每天进步一点点


来自 合肥
精华贴数 0
个人空间 60
技术积分 3568 (415)
社区积分 331 (1827)
注册日期 2001-11-7
论坛徽章:12
2008北京奥运纪念徽章:拳击数据库板块每日发贴之星生肖徽章2007版:蛇生肖徽章2007版:羊生肖徽章2007版:鼠数据库板块每日发贴之星
2008北京奥运纪念徽章:拳击行业板块每日发贴之星行业板块每日发贴之星数据库板块每日发贴之星行业板块每日发贴之星行业板块每日发贴之星

发表于 2004-7-14 16:19 
如何在存储过程中变量传递表名,在cursor中调用?

如何在存储过程中变量传递表名,在cursor中调用?
我的脚本如下:
CREATE OR REPLACE PROCEDURE Dfsc_Yhqfxx (dwbm IN VARCHAR2, ny IN VARCHAR2)
AS
table_name_yhda varchar(18);
CURSOR S_YS(table_name varchar2,P_HH VARCHAR2,P_YDNY VARCHAR2) IS SELECT YSDF FROM table_name WHERE YDNY=P_YDNY AND HH=P_HH;

begin
--拼凑要处理的表名
table_name_yhda:='DFSC.DFCD_YHDA'||'_'||'15'||'_'||'2004';
OPEN S_YS(table_name_yhdf,'100000338','200405'); --取当前用户应收
IF S_YS%FOUND THEN
FETCH S_YS INTO v_row.ys;
ELSE
V_row.ys:=0;
DBMS_OUTPUT.PUT_LINE(v_row.YHH||'应收无法取得');
END IF;
CLOSE S_YS;
end;


__________________
努力工作,健康生活
只看该作者    顶部
离线 yuxuan
每天进步一点点


来自 合肥
精华贴数 0
个人空间 60
技术积分 3568 (415)
社区积分 331 (1827)
注册日期 2001-11-7
论坛徽章:12
2008北京奥运纪念徽章:拳击数据库板块每日发贴之星生肖徽章2007版:蛇生肖徽章2007版:羊生肖徽章2007版:鼠数据库板块每日发贴之星
2008北京奥运纪念徽章:拳击行业板块每日发贴之星行业板块每日发贴之星数据库板块每日发贴之星行业板块每日发贴之星行业板块每日发贴之星

发表于 2004-7-15 11:33 
始终没有人能回答,郁闷


__________________
努力工作,健康生活
只看该作者    顶部
离线 yuxuan
每天进步一点点


来自 合肥
精华贴数 0
个人空间 60
技术积分 3568 (415)
社区积分 331 (1827)
注册日期 2001-11-7
论坛徽章:12
2008北京奥运纪念徽章:拳击数据库板块每日发贴之星生肖徽章2007版:蛇生肖徽章2007版:羊生肖徽章2007版:鼠数据库板块每日发贴之星
2008北京奥运纪念徽章:拳击行业板块每日发贴之星行业板块每日发贴之星数据库板块每日发贴之星行业板块每日发贴之星行业板块每日发贴之星

发表于 2004-7-18 13:47 
还是没有人回答


__________________
努力工作,健康生活
只看该作者    顶部
在线/呼叫 biti_rainy
人生就是如此



精华贴数 38
个人空间 0
技术积分 111201 (4)
社区积分 11832 (132)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2004-7-18 15:03 
你把sql当动态sql处理就可以了

dbms_sql 包一定能满足你的要求


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
只看该作者    顶部
离线 yuxuan
每天进步一点点


来自 合肥
精华贴数 0
个人空间 60
技术积分 3568 (415)
社区积分 331 (1827)
注册日期 2001-11-7
论坛徽章:12
2008北京奥运纪念徽章:拳击数据库板块每日发贴之星生肖徽章2007版:蛇生肖徽章2007版:羊生肖徽章2007版:鼠数据库板块每日发贴之星
2008北京奥运纪念徽章:拳击行业板块每日发贴之星行业板块每日发贴之星数据库板块每日发贴之星行业板块每日发贴之星行业板块每日发贴之星

发表于 2004-7-21 12:19 
谁能提供例子参照,谢谢


__________________
努力工作,健康生活
只看该作者    顶部
在线/呼叫 biti_rainy
人生就是如此



精华贴数 38
个人空间 0
技术积分 111201 (4)
社区积分 11832 (132)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2004-7-21 15:44 
google 能提供


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
只看该作者    顶部
在线/呼叫 taol
一般会员


精华贴数 0
个人空间 0
技术积分 232 (8369)
社区积分 21 (7483)
注册日期 2001-11-29
论坛徽章:1
授权会员     
      

发表于 2004-7-22 09:41 
PROCEDURE print_table (tab_name VARCHAR2) IS
TYPE RefCurTyp IS REF CURSOR;
cv RefCurTyp;
p Person;
h Hobbies;
BEGIN
OPEN cv FOR ’SELECT pers, hobbs FROM ’ || tab_name;
LOOP
FETCH cv INTO p, h;
EXIT WHEN cv%NOTFOUND;
-- print attributes of ’p’ and elements of ’h’
END LOOP;
CLOSE cv;
END;


__________________
浮云终日行,游子久不至。三夜频梦君,情亲见君意。告归常局促,苦道来不易:江湖多风波,舟楫恐失坠。出门搔白首,若负平生志。冠盖满京华,斯人独憔悴!孰云网恢恢?将老身反累!千秋万岁名,寂寞身后事。
只看该作者    顶部
离线 yuxuan
每天进步一点点


来自 合肥
精华贴数 0
个人空间 60
技术积分 3568 (415)
社区积分 331 (1827)
注册日期 2001-11-7
论坛徽章:12
2008北京奥运纪念徽章:拳击数据库板块每日发贴之星生肖徽章2007版:蛇生肖徽章2007版:羊生肖徽章2007版:鼠数据库板块每日发贴之星
2008北京奥运纪念徽章:拳击行业板块每日发贴之星行业板块每日发贴之星数据库板块每日发贴之星行业板块每日发贴之星行业板块每日发贴之星

发表于 2004-7-25 11:30 
谢谢taol提供的例子

to:biti_rainy
如果goolge能提供我也不会耽误大家时间在这里发贴了

在发贴之前我就搜索过了


__________________
努力工作,健康生活
只看该作者    顶部
在线/呼叫 biti_rainy
人生就是如此



精华贴数 38
个人空间 0
技术积分 111201 (4)
社区积分 11832 (132)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2004-7-25 14:34 
from oracle document

http://download-west.oracle.com/ ... 12/d_sql.htm#998168

如果仅仅是表名的变化,或者字段个数不变,上面有人已经说了,不过dbms_sql提供了强大的功能,但使用起来复杂一些


Example 2
The following sample procedure is passed the names of a source and a destination table, and copies the rows from the source table to the destination table. This sample procedure assumes that both the source and destination tables have the following columns:

id        of type NUMBER
name      of type VARCHAR2(30)
birthdate of type DATE


This procedure does not specifically require the use of dynamic SQL; however, it illustrates the concepts of this package.

CREATE OR REPLACE PROCEDURE copy (
     source      IN VARCHAR2,
     destination IN VARCHAR2) IS
     id_var             NUMBER;
     name_var           VARCHAR2(30);
     birthdate_var      DATE;
     source_cursor      INTEGER;
     destination_cursor INTEGER;
     ignore             INTEGER;
  BEGIN

  -- Prepare a cursor to select from the source table:
     source_cursor := dbms_sql.open_cursor;
     DBMS_SQL.PARSE(source_cursor,
         'SELECT id, name, birthdate FROM ' || source,
          DBMS_SQL.native);
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var);
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30);
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, birthdate_var);
     ignore := DBMS_SQL.EXECUTE(source_cursor);

  -- Prepare a cursor to insert into the destination table:
     destination_cursor := DBMS_SQL.OPEN_CURSOR;
     DBMS_SQL.PARSE(destination_cursor,
                  'INSERT INTO ' || destination ||
                  ' VALUES (:id_bind, :name_bind, :birthdate_bind)',
                   DBMS_SQL.native);

  -- Fetch a row from the source table and insert it into the destination table:
     LOOP
       IF DBMS_SQL.FETCH_ROWS(source_cursor)>0 THEN
         -- get column values of the row
         DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var);
         DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var);
         DBMS_SQL.COLUMN_VALUE(source_cursor, 3, birthdate_var);

  -- Bind the row into the cursor that inserts into the destination table. You
  -- could alter this example to require the use of dynamic SQL by inserting an
  -- if condition before the bind.
        DBMS_SQL.BIND_VARIABLE(destination_cursor, ':id_bind', id_var);
        DBMS_SQL.BIND_VARIABLE(destination_cursor, ':name_bind', name_var);
        DBMS_SQL.BIND_VARIABLE(destination_cursor, ':birthdate_bind',
birthdate_var);
        ignore := DBMS_SQL.EXECUTE(destination_cursor);
      ELSE

  -- No more rows to copy:
        EXIT;
      END IF;
    END LOOP;

  -- Commit and close all cursors:
     COMMIT;
     DBMS_SQL.CLOSE_CURSOR(source_cursor);
     DBMS_SQL.CLOSE_CURSOR(destination_cursor);
   EXCEPTION
     WHEN OTHERS THEN
       IF DBMS_SQL.IS_OPEN(source_cursor) THEN
         DBMS_SQL.CLOSE_CURSOR(source_cursor);
       END IF;
       IF DBMS_SQL.IS_OPEN(destination_cursor) THEN
         DBMS_SQL.CLOSE_CURSOR(destination_cursor);
       END IF;
       RAISE;
  END;
/


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
只看该作者    顶部
离线 yuxuan
每天进步一点点


来自 合肥
精华贴数 0
个人空间 60
技术积分 3568 (415)
社区积分 331 (1827)
注册日期 2001-11-7
论坛徽章:12
2008北京奥运纪念徽章:拳击数据库板块每日发贴之星生肖徽章2007版:蛇生肖徽章2007版:羊生肖徽章2007版:鼠数据库板块每日发贴之星
2008北京奥运纪念徽章:拳击行业板块每日发贴之星行业板块每日发贴之星数据库板块每日发贴之星行业板块每日发贴之星行业板块每日发贴之星

发表于 2004-7-26 13:21 
非常感谢biti_rainy的精彩回答,我得到两种解决方法


__________________
努力工作,健康生活
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问