不是我能找到:
使用简单的赋值不起作用,因为数组有不同的类型:
declare
type arrayforvarcharplsql is table of varchar2(30);
var_plsql_array arrayforvarcharplsql;
var_sql_array arrayforvarchar;
begin
var_plsql_array := arrayforvarcharplsql( 'X', 'Y' );
var_sql_array := var_plsql_array;
end;
/
输出:
ORA-06550: line 8, column 22:
PLS-00382: expression is of wrong type
ORA-06550: line 8, column 5:
PL/SQL: Statement ignored
尝试使用CAST在 PL/SQL 范围内不起作用,因为它只在 SQL 范围内起作用:
declare
type arrayforvarcharplsql is table of varchar2(30);
var_plsql_array arrayforvarcharplsql;
var_sql_array arrayforvarchar;
begin
var_plsql_array := arrayforvarcharplsql( 'X', 'Y' );
var_sql_array := CAST( var_plsql_array AS arrayforvarchar );
end;
/
输出:
ORA-06550: line 8, column 22:
PLS-00204: function or pseudo-column '' may be used inside a SQL statement only
ORA-06550: line 8, column 5:
PL/SQL: Statement ignored
尝试将 PL/SQL 集合传递到 SQL 范围内以便能够使用CAST不起作用,因为 PL/SQL 集合不能在 SQL 范围内使用:
declare
type arrayforvarcharplsql is table of varchar2(30);
var_plsql_array arrayforvarcharplsql;
var_sql_array arrayforvarchar;
begin
var_plsql_array := arrayforvarcharplsql( 'X', 'Y' );
SELECT CAST( var_plsql_array AS arrayforvarchar )
INTO var_sql_array
FROM DUAL;
end;
/
输出:
ORA-06550: line 8, column 18:
PLS-00642: local collection types not allowed in SQL statements
尝试将 PL/SQL 集合传递到 SQL 范围内的表集合表达式中并使用BULK COLLECT与前面相同的原因不起作用:
declare
type arrayforvarcharplsql is table of varchar2(30);
var_plsql_array arrayforvarcharplsql;
var_sql_array arrayforvarchar;
begin
var_plsql_array := arrayforvarcharplsql( 'X', 'Y' );
SELECT COLUMN_VALUE
BULK COLLECT INTO var_sql_array
FROM TABLE( var_plsql_array );
end;
/
输出:
ORA-06550: line 10, column 19:
PLS-00642: local collection types not allowed in SQL statements
ORA-06550: line 10, column 12:
PL/SQL: ORA-22905: cannot access rows from a non-nested table item
ORA-06550: line 8, column 5:
PL/SQL: SQL Statement ignored
但是,使用循环并单独分配值确实有效:
declare
type arrayforvarcharplsql is table of varchar2(30);
var_plsql_array arrayforvarcharplsql;
var_sql_array arrayforvarchar;
begin
var_plsql_array := arrayforvarcharplsql( 'X', 'Y' );
var_sql_array := arrayforvarchar();
var_sql_array.EXTEND( var_plsql_array.COUNT );
FOR i IN 1 .. var_plsql_array.COUNT LOOP
var_sql_array(i) := var_plsql_array(i);
END LOOP;
end;
/
db<>在这里摆弄