Sql 使用executeimmediate在循环中分配多个字段

Sql 使用executeimmediate在循环中分配多个字段,sql,plsql,execute-immediate,Sql,Plsql,Execute Immediate,我正在使用PLPDF的库为各种文件创建电子表格——我正在尝试编写一个程序,以获取每个字段的值,并逐个将其插入电子表格。此操作可以将许多不同的表放入许多不同的电子表格中,因此仅进行导出并不会减少它 本例中有两个从表中创建的游标-用于选择列名的USER\u TAB\u COLUMNS,以及用于提取数据的实际视图查询。我有一个循环逐个记录地遍历数据记录,第二个循环遍历记录中的字段 在实际写入电子表格blob之前,我只需运行dbms\u output.putline,以确保获得所需的数据 声明 q_st

我正在使用PLPDF的库为各种文件创建电子表格——我正在尝试编写一个程序,以获取每个字段的值,并逐个将其插入电子表格。此操作可以将许多不同的表放入许多不同的电子表格中,因此仅进行导出并不会减少它

本例中有两个从表中创建的游标-用于选择列名的USER\u TAB\u COLUMNS,以及用于提取数据的实际视图查询。我有一个循环逐个记录地遍历数据记录,第二个循环遍历记录中的字段

在实际写入电子表格blob之前,我只需运行
dbms\u output.putline
,以确保获得所需的数据

声明
q_str varchar2(100);
这是varchar2(3000);
光标在您的桌子上
从vcars_饮食中选择*,其中nhp_id=8573;
我的饮食结构是
选择“开始:1:=i.| |列| | |”;结束;'来自用户选项卡列的行代码,其中表名='VCARS\u DIET';
开始
对于i,在diet_table循环中
DBMS_OUTPUT.PUT_行('---------------------------------------------------------------');
对于饮食循环中的h
DBMS_OUTPUT.PUT_LINE('i的Varchar值:“| | h.LINE_o_code | |””);
使用此vc执行立即(h.line_o_代码);
DBMS|u OUTPUT.PUT_LINE('i.| | h.LINE_o|u code |的Varchar值为:'| | this|vc);
端环;
端环;
结束;
饮食表中的字段包括:

NHP_ID
DATE_TIME
DIET_NO
FORM_NAME
DATA_TYPE 
结果是:

ORA-06550:第1行第13列: PLS-00201:必须声明标识符“I.NHP_ID” ORA-06550:第1行第7列: PL/SQL:忽略语句 ORA-06512:在第33行 655000000-“行%s,列%s:\n%s” *原因:通常是PL/SQL编译错误。 *行动:


我从Connor McDonald的解决方案中复制了这个PL/SQL代码。 它使用类型动态SQL解析任何SQL查询,并将列名和值转换为集合。我在HR模式中对employees表使用了一个示例查询。将其替换为您的查询

set serverout on size 999999
set verify off
declare
    p_query varchar2(32767) := 
              q'{select * from employees 
                          where rownum = 1
                 }';-- Here you put your query  
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(4000);
    l_status        integer;
    l_descTbl       dbms_sql.desc_tab;
    l_colCnt        number;
    n number := 0;
  procedure p(msg varchar2) is
    l varchar2(4000) := msg;
  begin
    while length(l) > 0 loop
      dbms_output.put_line(substr(l,1,80));
      l := substr(l,81);
    end loop;
  end;
begin
    execute immediate
    'alter session set nls_date_format=''dd-mon-yyyy hh24:mi:ss'' ';

    dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
    dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );

    for i in 1 .. l_colCnt loop
        dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000);
    end loop;

    l_status := dbms_sql.execute(l_theCursor);

    while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
        for i in 1 .. l_colCnt loop
            dbms_sql.column_value( l_theCursor, i, l_columnValue );
            p( 'Value for '|| l_descTbl(i).col_name
              || ' is: ' || 
              l_columnValue );
        end loop;
        dbms_output.put_line( '-----------------' );
        n := n + 1;
    end loop;
    if n = 0 then
      dbms_output.put_line( chr(10)||'No data found '||chr(10) );
    end if;
end;
/
这将提供以下输出:

Value for EMPLOYEE_ID is: 198
Value for FIRST_NAME is: Donald
Value for LAST_NAME is: OConnell
Value for EMAIL is: DOCONNEL
Value for PHONE_NUMBER is: 650.507.9833
Value for HIRE_DATE is: 21-jun-2007 00:00:00
Value for JOB_ID is: SH_CLERK
Value for SALARY is: 2600
Value for COMMISSION_PCT is: 
Value for MANAGER_ID is: 124
Value for DEPARTMENT_ID is: 50
-----------------


PL/SQL procedure successfully completed.

这个过程正是我想要的。我将被授予在我的个人测试区域使用dbms_sql包的权利,但这将填补账单。谢谢@肯谢尔顿:不客气。如果你发现答案是有用的,考虑它,它也会帮助别人。