代码之家  ›  专栏  ›  技术社区  ›  jlpp

是否可以在过程之间传递类型为record的Oracle变量,而不让过程知道其实际类型?

  •  3
  • jlpp  · 技术社区  · 15 年前

    使用Oracle 10g pl/sql。我试图找到一种方法来传递自定义的记录类型,而不必让过程知道它的真正类型。听起来像sys.anydata的作业,但看起来Oracle不支持包装记录类型。例如:

    DECLARE
      TYPE t_rec IS RECORD (id number);
      v_rec t_rec;
      v_ad SYS.ANYDATA;
    BEGIN
      v_rec.id := 1;
      v_ad := SYS.ANYDATA.CONVERTOBJECT(v_rec);
    END;
    

    失败并出现错误:

    v_ad := SYS.ANYDATA.CONVERTOBJECT(v_rec);
          *
    ERROR at line 7:
    ORA-06550: line 7, column 11:
    PLS-00306: wrong number or types of arguments in call to 'CONVERTOBJECT'
    ORA-06550: line 7, column 3:
    PL/SQL: Statement ignored
    

    显然,ConvertObject不期望有记录,但我在上没有看到任何其他候选对象 http://download-west.oracle.com/docs/cd/B19306_01/appdev.102/b14258/t_anydat.htm 要么。

    最后,我要寻找的是在同一个变量中存储不同记录类型的方法。我还想避免使用Oracle对象类型(在包外部定义的顶级类型),因为它们有自己的问题。

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  1
  •   DCookie    15 年前

    This section 在pl/sql用户指南和引用中,将指示您不能直接执行您想在这里执行的操作-pl/sql希望尝试在运行时转换参数。您可能想看看是否可以使refcursor工作。简单例子:

    CREATE OR REPLACE PROCEDURE TheTest AS
    
        v_cursor SYS_REFCURSOR;
        v_v1   NUMBER;
        v_v2   NUMBER;
        v_v3   NUMBER;
    
      PROCEDURE getRS(pr OUT SYS_REFCURSOR) IS
      BEGIN
        OPEN pr FOR SELECT 1,2,3 FROM dual;
      END;
    
      BEGIN
        getRS(v_cursor);
        FETCH v_cursor INTO v_v1, v_v2, v_v3;
        dbms_output.put_line(v_v1||','||v_v2||','||v_v3);
        CLOSE v_cursor;
      END;
    

    然后,您可以将光标变量引用传递给心脏的内容。

    Hth.

    编辑:

    另一个选项是用不同的记录类型重载相同的处理程序过程,具体取决于需要处理多少个记录类型。

        2
  •  1
  •   Gary Myers    15 年前

    您试图处理两个独立的层,pl/sql和sql。 SQL不理解PL/SQL记录,并且不会处理它们。

    “最终,我要寻找的是在同一个变量中存储不同记录类型的方法。” 编写将它们转换为/来自XML的包装器。

    无意冒犯,但是看看你的其他文章,你似乎在试图在SQL和PL/SQL上强加一个面向对象的范例,但是它并不太合适。如果不对XE进行编码,那么可以考虑在数据库中使用Java存储过程。

        3
  •  -1
  •   Michal Pravda    15 年前

    从我的观点来看,应用程序设计应该从最底层开始,通常是数据库。你似乎试图强迫数据库做一些不该做的事情。

    如果您真的想要通用容器,那么您总是可以序列化任何东西,例如XML,并将其存储为文本(CLOB)(在本例中,您可以将其存储为XML类型)。不过,我建议重新考虑这种方法,并开始使用db-store和retrieve行的核心功能。