代码之家  ›  专栏  ›  技术社区  ›  Pawan Rawat

在DBSMS_SQL.DEFINE_column oracle 12C中提供列数据类型

  •  0
  • Pawan Rawat  · 技术社区  · 7 年前

    我必须在以下两个条件下将数据从一个表复制到另一个表

    1. 需要一次复制一条记录,以便在需要时对列值进行修改

    我已经创建了一个过程来通过动态查询来实现这一点。由于列列表未知,我无法声明rowtype变量。我看到了一个DBMS_SQL示例,您可以在其中定义select子句的列。以下是格式

    DBMS_SQL.DEFINE_COLUMN(cursor_var,position,column_var);
    

    下面只是一个示例代码

    CREATE OR REPLACE PROCEDURE pr_test (P_TABLE_NAME IN VARCHAR2)
    IS
        V_SQL VARCHAR2(500);
        SRC_CUR INT;
        DEST_CUR INT;
    
        TYPE COL_DTL_TYPE IS RECORD
        (
            COLUMN_ID INT,
            COLUMN_NAME VARCHAR2(250),
            DATA_TYPE VARCHAR2(250),
            DATA_LENGTH INT
        );
    
        COL_DTL_REC COL_DTL_TYPE;
    
        TYPE TBL_COL_LIST_TYPE IS TABLE OF COL_DTL_TYPE;
        TBL_COL_LIST TBL_COL_LIST_TYPE;
    
        V_CNT INT := 0;
    BEGIN
        V_SQL := 'SELECT * FROM ' || P_TABLE_NAME;
        SRC_CUR := DBMS_SQL.OPEN_CURSOR;
        DBMS_SQL.PARSE(SRC_CUR,V_SQL,DBMS_SQL.NATIVE);
        TBL_COL_LIST := TBL_COL_LIST_TYPE();
    
        FOR COL_DTL_REC IN (
            SELECT COLUMN_ID,COLUMN_NAME,DATA_TYPE,DATA_LENGTH 
            FROM ALL_TAB_COLUMNS WHERE TABLE_NAME =P_TABLE_NAME
        )
        LOOP
            V_CNT := V_CNT + 1;
            TBL_COL_LIST.EXTEND;
            TBL_COL_LIST(V_CNT) := COL_DTL_REC;
    
            -- Here is where I am stuck and not able to give column data type
            DBMS_SQL.DEFINE_COLUMN(SRC_CUR,V_CNT,COL_DTL_REC.COLUMN_NAME COL_DTL_REC.DATA_TYPE , COL_DTL_REC.DATA_LENGTH)
        END LOOP;
    END;
    

    稍后将复制到目标表。

    0 回复  |  直到 7 年前