表记录到PL / SQL

时间:2016-02-19 19:26:23

标签: plsql

我们目前使用Oracle / PL / SQL和Oracle Forms WEB作为用户界面。

问题是我们决定将UI从Forms迁移到另一个UI(可能是HTML5 / Angular ......)。 我们的系统架构以一种批量代码保持不变的方式分层,我们所要做的就是从新技术中访问GUIFaçade(仍然需要选择)。问题是:这个GUIFaçade提供的所有数据(当前是Oracle Forms)都是在以下集合中构建的:

TYPE tp_rc_cod IS RECORD( 
-- Return code 
cd_return NUMBER(2), 
-- Name 
cd_name some_table.name%TYPE 
); 
TYPE tp_table_rc_cod IS TABLE OF tp_rc_cod INDEX BY PLS_INTEGER; 

那么,有没有办法快速将当前GUIFaçade的返回值从表记录转换为XML或JSON? 我们考虑在新UI和当前GUIFaçade的中间构建一个Wrapper,但是系统不小,所以它可能变得很难构建并且可能存在性能问题。

我已经知道Oracle JDBC驱动程序支持调用参数或返回PL / SQL RECORD,BOOLEAN或具有非标量元素类型的表的值是不可行的。但是,Oracle JDBC驱动程序支持标量元素类型的PL / SQL索引表。如果发生这种情况,例如Oracle Forms如何做到这一点?它是否构建了Wrapper本身?

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

IF 您的类型是实际的oracle类型(而不是包类型),您可以将它们转换为包含xml输出的CLOB,其代码类似于

declare
l_tab  tp_table_rc_cod := tp_table_rc_cod();
--new variables
l_rc SYS_REFCURSOR;
l_xmlctx number;
l_new_retval CLOB;
begin


l_tab.extend(1);
l_tab(1) := tp_rc_cod( 1, 'testname');

--TABLE RETURN
--return l_tab;

-- XML RETURN
open l_rc for select * from table(l_tab);
l_xmlctx := SYS.DBMS_XMLGEN.NEWCONTEXT(l_rc);

l_new_retval := dbms_xmlgen.getXML(l_xmlctx);
DBMS_XMLGEN.closeContext(l_xmlctx);
--return l_new_retval;
end;
/

但是你看到它仍然是一些努力。还有其他您可能想要设置的DBMS_XMLGEN选项。

我也认为oracle 12确实删除了“oracle类型”的要求,但我不确定。

我不确定是否完全回答了你的问题,但我希望有所帮助