这是我尝试运行的PL / SQL过程。我面临无效目录路径的问题。我在Windows服务器上运行Oracle 11g。我有一个客户端在不同的机器上配置,这是一台linux机器。我试图检查init.ora文件来设置目录路径,但似乎在11g Windows oracle版本中不支持futil包
如何从表中导入单个列,其中XML_clob(存储在一堆中的XML),列类型在这种情况下为CLOB并转储到文件中。感谢是否有更好的PL / SQL过程可用于将整个列转换为单个文件并通过客户端计算机存储在目录中
感谢对我的问题的指导的回应
CREATE or REPLACE PROCEDURE
process_all_rows
IS
TYPE clob_aat
IS TABLE OF minf100k300wclob%xml_clob
INDEX BY PLS_INTEGER;
l_XML clob_aat;
BEGIN
select XMLElement(xml_clob).getClobVal()
BULK COLLECT INTO l_XML
FROM minf100k300wclob;
FOR indx IN 1 .. L_XML.COUNT
LOOP
dbms_lob.append(L_XML, 'XML_EDI_FILES_1', 'file1.xml', nls_charset_id('AL32UTF8'));
END LOOP;
END process_all_rows;
我无法解决此问题,因为我收到错误,如下所示
PROCEDURE PROCESS_ALL_ROWS的错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/4 PL/SQL: Item ignored
5/33 PLS-00208: identifier 'XML_CLOB' is not a legal cursor attribute
12/22 PLS-00382: expression is of wrong type
18/7 PL/SQL: Statement ignored
18/7 PLS-00306: wrong number or types of arguments in call to 'APPEND'
SQL>
enter code here
答案 0 :(得分:1)
1)好吧,要使用clob2file
或大多数依赖UTL_FILE
的函数,必须首先在oracle数据库中创建directory object
。语法是:
CREATE DIRECTORY XML_EDI_FILES AS 'C:\path\on\your\server\';
这会将服务器上的指定目录添加到具有您指定名称的特殊oracle表,在这种情况下为XML_EDI_FILES
。稍后调用与文件相关的过程时,您将该名称作为参数传递。有关详细信息,请参阅docs。当然,服务器上的oracle进程必须具有该dir的写权限。
2)等待,通过客户端机器?例如,使用sqlplus spool。粗略的语法是
set long 4000;
spool output_file.txt
select xml_clob from minf100k300wc
虽然我几乎可以保证这首先不会按预期工作,因为sql-plus也会输出列名,插入换行符等等。你必须查找sqlplus格式化选项。我可能会使用一些Java代码,Clobs很好地映射到字符串IIRC。
3)目前尚不清楚你在问什么。
回答更新的问题:
...但我甚至在评论中描述了你必须做的事情。你走了:
CREATE or REPLACE PROCEDURE process_all_rows IS
tmp_clob clob;
cursor cur_clob is
select XMLElement(xml_clob).getClobVal() val FROM minf100k300wclob;
begin
dbms_lob.createtemporary(tmp_clob,true);
for c in cur_clob loop
dbms_lob.append(tmp_clob, c.val);
end loop;
dbms_xslprocessor.clob2file(tmp_clob, 'XML_EDI_FILES_1', 'file1.xml', nls_charset_id('AL32UTF8'));
dbms_lob.freetemporary(tmp_clob);
end;