Sql 使用executeimmediate在循环中分配多个字段
我正在使用PLPDF的库为各种文件创建电子表格——我正在尝试编写一个程序,以获取每个字段的值,并逐个将其插入电子表格。此操作可以将许多不同的表放入许多不同的电子表格中,因此仅进行导出并不会减少它 本例中有两个从表中创建的游标-用于选择列名的USER\u TAB\u COLUMNS,以及用于提取数据的实际视图查询。我有一个循环逐个记录地遍历数据记录,第二个循环遍历记录中的字段 在实际写入电子表格blob之前,我只需运行Sql 使用executeimmediate在循环中分配多个字段,sql,plsql,execute-immediate,Sql,Plsql,Execute Immediate,我正在使用PLPDF的库为各种文件创建电子表格——我正在尝试编写一个程序,以获取每个字段的值,并逐个将其插入电子表格。此操作可以将许多不同的表放入许多不同的电子表格中,因此仅进行导出并不会减少它 本例中有两个从表中创建的游标-用于选择列名的USER\u TAB\u COLUMNS,以及用于提取数据的实际视图查询。我有一个循环逐个记录地遍历数据记录,第二个循环遍历记录中的字段 在实际写入电子表格blob之前,我只需运行dbms\u output.putline,以确保获得所需的数据 声明 q_st
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包的权利,但这将填补账单。谢谢@肯谢尔顿:不客气。如果你发现答案是有用的,考虑它,它也会帮助别人。