动态识别表(由变量识别的表)

Posted

技术标签:

【中文标题】动态识别表(由变量识别的表)【英文标题】:Dynamically Identify Table (Table Identified by Variable) 【发布时间】:2013-11-11 11:02:12 【问题描述】:

我正在尝试创建一个过程,该过程允许我将现有行动态写入另一个表,但以下 sn-p 中的行声明和插入语句不起作用。错误消息表明,虽然输出 target_table.table_name 工作正常,但尚未识别视图。

稍后将在块中添加更多内容 - 例如带有操作的列(例如 INSERT 或 UPDATE)。这只是一个简单的例子,最后一个过程(pass_reference)用于触发过程。

任何帮助将不胜感激。

CREATE OR REPLACE PROCEDURE denormalize (new_cursor sys_refcursor, target_table_name varchar)
IS
target_table user_tables%rowtype;
sql_target_table varchar(200) := 'select * from user_tables where table_name = :target_table_name';
row target_table%rowtype;
BEGIN
  execute immediate sql_target_table into target_table using target_table_name;
  LOOP
    fetch new_cursor into row;
    exit when new_cursor%notfound;
    insert into target_table values row;
    commit;
  END LOOP;
END denormalize;
/

CREATE OR REPLACE PROCEDURE pass_reference
AS
new_cursor sys_refcursor;
BEGIN
open new_cursor for select * from sales where sales_id=1;
denormalize(new_cursor, 'NEW_SALES');
END;
/

【问题讨论】:

【参考方案1】:

请检查此代码,它不能正常工作,例如,您看到光标中的工作列应命名为目标表中的列。 我从基于视图在邮件中创建 html 表的包中获取此代码,希望您发现此示例有用 祝你好运

declare
    in_view_name   varchar2(30);
    in_table_name  varchar2(30) := 'your_new_table';
    out_rc         number;
    out_rc_txt     varchar2(1000);
    l_cursor       number;
    l_sql          varchar2(50) := 'select * from ' || in_view_name;
    l_col_cnt      binary_integer;
    l_col_tab      dbms_sql.desc_tab;
    l_column_value varchar2(4000);
    l_is_empty     boolean := true;
    l_insert_header varchar2(1000);
    l_insert varchar2(32000);
begin
    out_rc     := 0;
    out_rc_txt := 'OK';

    l_cursor := dbms_sql.open_cursor;
    dbms_sql.parse(l_cursor, l_sql, dbms_sql.native);
    l_col_cnt := dbms_sql.execute(l_cursor);
    dbms_sql.describe_columns(l_cursor, l_col_cnt, l_col_tab);

    l_insert_header := 'insert into '||in_table_name||'(';
    if l_col_cnt > 0 then
        -- header
        for i in l_col_tab.first .. l_col_tab.last loop
            dbms_lob.append(l_insert_header, l_col_tab(i).col_name);
            if i != l_col_tab.last then
                dbms_lob.append(l_insert_header, ',');
            end if;
            dbms_sql.define_column(l_cursor, i, l_column_value, 4000);
        end loop;
        l_insert_header := l_insert_header || ') values(';
        -- data
        while dbms_sql.fetch_rows(l_cursor) > 0 loop
            l_is_empty := false;
            l_insert := l_insert_header;
            for i in l_col_tab.first .. l_col_tab.last loop
                dbms_sql.column_value(l_cursor, i, l_column_value);

                l_insert := l_insert || '''' || l_column_value || ''','
                if not in_attachment then
                    dbms_lob.append(out_table, l_td);
                end if;

                if (not in_attachment) or (l_column_value is not null) then
                    dbms_lob.append(out_table, nvl(l_column_value, l_nbsp));
                end if;

                if (not in_attachment) or (i != l_col_tab.last) then
                    dbms_lob.append(out_table, l_tdc);
                end if;
            end loop;
            l_insert := substr(l_insert, 1, length(l_insert) - 1) || ')';
            execute immediate l_insert;
        end loop;
    end if;

    dbms_sql.close_cursor(l_cursor);
end;

【讨论】:

谢谢,加尔巴拉德。我看到它如何适应我的例子。基本上,需要详细说明 SQL 查询。但是,我不接受答案,希望有人有更优雅的解决方案。

以上是关于动态识别表(由变量识别的表)的主要内容,如果未能解决你的问题,请参考以下文章

描述人脸识别的过程

人工智能园 | 图像识别技术介绍

计算机是怎样识别程序语言的

如何开发Java动态人脸识别

appdesign中的函数或变量参数无法识别

有没有支持多人人脸识别的算法,要识别的人脸比较多