【Oracle】动态SQL与游标

Oracle 存储过程,实现:根据存储过程入参拼接动态的查询SQL,将查询结果存入游标中,再从游标中取出数据,存入另一张表中。

下面的PL/SQL中,核心即为 OPEN C_UNITCIREF_TMP FOR 'SELECT CIMID FROM ' || TABLE_NAME;

CREATE OR REPLACE PROCEDURE P_SAVE_DEVDICT(DEVTYPE_NAME IN VARCHAR2, -- 设备类型名称
                                           TABLE_NAME IN  VARCHAR2,  -- 表名
                                           IS_SUCC      OUT VARCHAR2) IS
  -- 设备类型ID
  V_TYPE_ID VARCHAR2(42) := '';

  V_SQL VARCHAR2(100) := '';

  V_CIMID VARCHAR2(64) := '';

  TYPE TYPE_CURSOR IS REF CURSOR; -- 游标

  C_UNITCIREF_TMP TYPE_CURSOR;
  
BEGIN

  IS_SUCC := '0';

  -- 根据设备类型名称查找对应的设备类型ID
  SELECT ID
    INTO V_TYPE_ID
    FROM T_DEV_TYPE
   WHERE NAME = '' || DEVTYPE_NAME || '';

  OPEN C_UNITCIREF_TMP FOR 'SELECT CIMID FROM ' || TABLE_NAME;
  LOOP
     FETCH C_UNITCIREF_TMP INTO V_CIMID;
     EXIT WHEN C_UNITCIREF_TMP%NOTFOUND;
     INSERT INTO T_DEV_DICT
      (ID, CIMID, TYPE_ID)
    VALUES
      (SYS_GUID(), V_CIMID, V_TYPE_ID);
  END LOOP;
  
  COMMIT;
  
  IS_SUCC := '1';
  
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    IS_SUCC := '-1';
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END P_SAVE_DEVDICT;
/

猜你喜欢

转载自xurichusheng.iteye.com/blog/2225961