0 0

存储过程中如何查询动态表并插入一个游标10

下边是存储过程的代码

create or replace procedure JK_ODSO_PROD_CUST_RELA(bat_id in varchar2,area in varchar2) is
table_name varchar2(64) := 'PDT_SERV_'||area;
table_name_jk varchar2(64) := 'ODSO.ODSO_PROD_CUST_RELA_'||area||'@JIEKOU';
Cursor myCur is select prd_id from table_name where trunc(ZH_CHECK_DATE,'dd')=trunc(sysdate,'dd');
v_prd_id varchar2(64);
e_err varchar2(2000) :='';

insertSql_e8_phone varchar2(4000) := 'insert into '||table_name_jk||'(
                  PROD_ID,
                  PROPERTY_CUST_ID,
                  CUST_ID,
                  PROD_ADDRESS,
                  STATUS,
                  BAT_ID,
                  PRD_ID,
                  MEDIUMTYPE,
                  E8PRODUCTINSTANCE) '||'
          select
                  a.SERV_ID,
                  a.OWN_CUST_ID,
                  a.USE_CUST_ID,
                  a.INSTALL_ADDR,
                  decode(a.ZH_CHECK_TYPE,''ori_rec'',''insert'',''add_rec'',''insert'',''mod_rec'',''update'',''del_rec'',''delete'',null),
                  :bat_id,
                  PRD_ID,
                  b.val,
                  b.PRD_INST_ID
          from '||table_name||'  a,
              (select DISTINCT PRD_INST_ID, VAL from PDT_SERV_ATTR_'||area||' Where PRD_FEA_TYPE_ID=718 AND ZH_CHECK_TYPE <>''del_rec'') b
              where trunc(a.ZH_CHECK_DATE,''dd'')=trunc(sysdate,''dd'') and a.prd_inst_id=b.prd_inst_id';
          
insertSql_e8_adsl varchar2(4000) := 'insert into '||table_name_jk||'(
                  PROD_ID,
                  PROPERTY_CUST_ID,
                  CUST_ID,
                  PROD_ADDRESS,
                  STATUS,
                  BAT_ID,
                  PRD_ID,
                  MEDIUMTYPE,
                  E8PRODUCTINSTANCE,
                  BANDWIDTH) '||'
          select
                  a.SERV_ID,
                  a.OWN_CUST_ID,
                  a.USE_CUST_ID,
                  a.INSTALL_ADDR,
                  decode(a.ZH_CHECK_TYPE,''ori_rec'',''insert'',''add_rec'',''insert'',''mod_rec'',''update'',''del_rec'',''delete'',null),
                  :bat_id,
                  PRD_ID,
                  b.val,
                  b.PRD_INST_ID
                  c.val
          from '||table_name||' a,
              (select distinct PRD_INST_ID, VAL from PDT_SERV_ATTR_553 Where PRD_FEA_TYPE_ID=718 AND ZH_CHECK_TYPE <>''del_rec'') b,
              (select distinct PRD_INST_ID, VAL From PDT_SERV_ATTR_553 Where PRD_FEA_TYPE_ID IN (114,115) AND ZH_CHECK_TYPE <>''del_rec'') c
              where trunc(a.ZH_CHECK_DATE,''dd'')=trunc(sysdate,''dd'') and
              a.prd_inst_id=b.prd_inst_id and
              a.prd_inst_id=c.prd_inst_id';
insertSql varchar2(4000) := 'insert into '||table_name_jk||'(
                  PROD_ID,
                  PROPERTY_CUST_ID,
                  CUST_ID,
                  PROD_ADDRESS,
                  STATUS,
                  BAT_ID,
                  PRD_ID) '||'
          select
                  a.SERV_ID,          
                  a.OWN_CUST_ID,                    
                  a.USE_CUST_ID,      
                  a.INSTALL_ADDR,    
                  decode(a.ZH_CHECK_TYPE,''ori_rec'',''insert'',''add_rec'',''insert'',''mod_rec'',''update'',''del_rec'',''delete'',null),
                  :bat_id,
                  PRD_ID
          FROM '||table_name||'
            a where trunc(a.ZH_CHECK_DATE,''dd'')=trunc(sysdate,''dd'')';
begin
--if myCur%isopen = false then
      open myCur;
--  end if;
  LOOP
      --取出产品数据类型
      fetch myCur into v_prd_id;
      --本身是E8-C产品
      if v_prd_id ='1101' THEN
          execute immediate insertSql_e8_phone using bat_id;
          commit;
      --电话挂载的E8-C产品
      ELSIF v_prd_id='1304' THEN
          execute immediate insertSql_e8_phone using bat_id;
          commit;
      --ADSL挂载的E8-C产品
      ELSIF v_prd_id='1307' THEN
          execute immediate insertSql_e8_adsl using bat_id;
          commit;
      else
          execute immediate insertSql using bat_id;
          commit;
      END IF ;
  end LOOP;
close myCur;
  insert into MSG_INTERFACE_LOG values(sysdate,'1007','产品客户关联','success',bat_id);
  commit;
exception
  when others then
      rollback;
      e_err := SQLCODE||' <>'||SQLERRM;
      insert into MSG_INTERFACE_LOG values(sysdate,'1007','产品客户关联',e_err,bat_id);
      commit;
      raise;
end JK_ODSO_PROD_CUST_RELA;

不过把红色的部分换成一个固定的表则可以正常执行。否则有错误,提示这个表不存在,其实是存在的,因为area是个变量,存储过程就不认这个表了,
大家帮看下
2010年3月02日 09:39

1个答案 按时间排序 按投票排序

0 0

好难

2010年3月18日 16:39

相关推荐

    存储过程游标用于批量的插入数据

    在打开游标后,通过一个`while`循环来不断读取游标中的数据,并将每一条学生ID插入到`DynamicEvaluation`表中。需要注意的是,使用`@@fetch_status`判断是否已经到达结果集的末尾,如果达到则通过`break`语句退出...

    存储过程和游标

    本例中需要创建一个名为“填班级人数”的存储过程,该过程使用游标遍历每个班级的学生数量,并更新到班级表中。具体实现如下: ```sql CREATE PROCEDURE 填班级表人数过程 AS BEGIN DECLARE @i INT, @classId CHAR...

    oracle存储过程使用游标对多表操作例子

    本文将深入探讨如何在Oracle存储过程中使用游标进行多表操作,具体通过一个示例来展示这一过程。 ### 标题与描述分析 标题:“oracle存储过程使用游标对多表操作例子”直接指出了文章的主题是关于在Oracle环境下,...

    存储过程触发器 游标

    例如,在一个订单处理系统中,可以创建一个触发器,每当有新订单插入时,这个触发器会调用一个存储过程,该过程使用游标遍历订单的每一项商品,检查库存并更新相关记录。这样,系统可以自动跟踪库存变化,无需额外的...

    存储过程和游标详解

    存储过程是预编译的一系列SQL语句集合,存储在数据库中,并以一个特定的名字标识。当需要执行这些预定义的操作时,只需通过调用存储过程的名称,数据库就会自动执行其中的所有语句,无需再次编译,这大大提高了执行...

    oracle存储过程游标

    该触发器定义了在`s_c`表上进行删除操作前的逻辑,即当有记录被删除时,将该记录插入到另一个表`s_c1`中。 #### 四、视图的创建与维护 视图是基于表或其他视图的一种虚拟表,它可以简化数据查询、保护敏感数据等。...

    Oracle存储过程实例使用显示游标

    在本例中,“Oracle存储过程实例使用显示游标”着重展示了如何在存储过程中调用函数,并通过游标来处理和更新数据。 首先,我们需要了解存储过程的基本结构。一个存储过程通常包含以下部分: 1. **声明部分**:在...

    mysql存储过程_游标_项目练习

    2. 使用游标:在存储过程中声明并打开一个游标,以便逐行处理查询结果。通过FETCH语句获取游标当前指向的数据行,并进行相应的操作。 3. 条件判断与循环:可能需要在存储过程中使用IF-ELSE结构进行条件判断,或者...

    实验八数据库编程技术——游标、存储过程与触发器.pdf

    触发器可以理解为一个事件处理器,用于响应数据库中的事件,例如,插入、更新、删除操作。触发器的主要应用场景包括: *数据一致性:触发器可以用于实现数据的一致性,例如,检查数据是否符合业务规则。 *数据安全...

    job 存储过程 视图 游标结合实例

    例如,你可以编写一个存储过程,该过程接受参数,根据参数值动态构建并执行SQL查询。 3. 视图 视图是从一个或多个表中选择数据的虚拟表,它不存储数据,但提供了一种简化数据访问和聚合的方式。视图可以隐藏复杂的...

    TSQL 存储过程 和 游标

    存储过程中不使用`GO`语句,因为`GO`在批处理中用于分隔命令,而存储过程本身就是一个批处理。 总之,TSQL的存储过程和游标是数据库管理和数据操作的重要工具。存储过程增强了SQL语言的功能,提高了代码复用性,...

    ORACLE 游标 异常 存储过程

    - **示例**:一个使用游标的存储过程可能用于更新表中满足特定条件的行: ```sql CREATE OR REPLACE PROCEDURE update_rows AS cursor_name CURSOR FOR SELECT * FROM table_name WHERE condition; var1 ...

    sqlserver游标存储过程的使用

    1. **声明游标**:首先需要声明一个游标,指定其类型、源数据集(通常是查询语句)以及其属性。例如: ```sql DECLARE @MyCursor CURSOR FOR SELECT * FROM MyTable; ``` 2. **打开游标**:声明后,需要使用OPEN语句...

    oracle 的函数、存储过程、游标、简单实例

    再比如,创建一个存储过程来批量更新表中的数据: ```sql CREATE OR REPLACE PROCEDURE update_employee_salaries(p_department_id NUMBER) AS CURSOR emp_cursor IS SELECT employee_id, salary FROM employees ...

    SQLSREVER如何创建和使用动态游标

    创建动态游标的关键是设计一个能够动态生成 SELECT 语句的存储过程。在这个存储过程中,我们可以使用参数来传递 SELECT 语句,并使用字符串操作函数来生成最终的 SELECT 语句。 在本例中,我们使用了一个名为 `Usp_...

    TSQL 存储过程 游标 数据库 sql优化 存储过程分页

    存储过程是一组预编译的TSQL语句,它们被封装在一起并赋予一个特定的名字,以便在需要时能够方便地调用执行。存储过程在数据库设计中扮演着重要角色,它能够提升性能、增加代码复用、提高安全性,并简化复杂的操作。...

    游标、存储过程的使用事例

    ### 游标与存储过程在SQL Server中的应用 #### 一、游标的使用方法 游标是数据库管理系统中用于处理查询结果集的一种机制,它允许用户逐行地访问查询结果,而不是一次返回所有数据。这对于大数据量处理尤其有用,...

    mysql游标存储过程例子

    根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...

    sql 数据库使用游标 随机插入数据

    游标是数据库中的一个临时存储区域,它允许用户通过逐行的方式处理结果集中的数据。在SQL中,游标主要用于循环读取查询结果中的每一行数据。 #### 2. 游标的基本操作 - **声明游标**:使用`DECLARE cursor_name ...

Global site tag (gtag.js) - Google Analytics