PL SQL:动态创建oracle记录

时间:2017-04-03 08:52:45

标签: oracle plsql

我不知道是否可能,但我想在PL / SQL

中这样做

让我说我的程序中有一个参数,一个数字:numberColumns。

在程序中我想创建一条记录:

TYPE arrayColumn IS RECORD (
   column1 VARCHAR2(200),
   column2 VARCHAR2(200)...
   ... as much à numberColumns value
   ....
);

TY

2 个答案:

答案 0 :(得分:0)

您可以使用集合:

,而不是使用记录
CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(4000);
/

然后做:

CREATE OR REPLACE PROCEDURE your_procedure(
  number_columns IN  INTEGER,
  values         OUT stringlist
)
IS
BEGIN
  values := stringlist();
  IF number_columns < 1 THEN
    RETURN;
  END IF;
  values.EXTEND( number_columns );
  FOR i IN 1 .. number_columns LOOP
    values(i) := DBMS_RANDOM.STRING( 'X', 100 ); -- Assign some value
  END LOOP;
END;
/

否则,如果你真的想要一个记录,那么你必须得到动态SQL。

答案 1 :(得分:0)

使用Oracle中的OBJECT类型可以轻松实现这一点。但是这种架构根本没有建议。希望以下解决方案有所帮助。

CREATE OR REPLACE
PROCEDURE test_obj_form(
    a NUMBER )
AS
  lv_sql VARCHAR2(32676);
BEGIN
  SELECT '('
    ||listagg(str,',') WITHIN GROUP (
  ORDER BY lvl)
    ||')'
  INTO lv_sql
  FROM
    (SELECT 1 dum,
      'column'
      ||LEVEL
      ||' '
      ||'varchar2(200)' str,
      level lvl
    FROM dual
      CONNECT BY LEVEL < A
    ORDER BY LEVEL
    )
  GROUP BY dum;
  EXECUTE IMMEDIATE 'CREATE OR REPLACE TYPE name_rec IS OBJECT '||lv_sql;
  dbms_output.put_line(lv_sql);
END;
/