我不知道是否可能,但我想在PL / SQL
中这样做让我说我的程序中有一个参数,一个数字:numberColumns。
在程序中我想创建一条记录:
TYPE arrayColumn IS RECORD (
column1 VARCHAR2(200),
column2 VARCHAR2(200)...
... as much à numberColumns value
....
);
TY
答案 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;
/