PLS-00355 创建新的 table 类型时出错
PLS-00355 error whike creating a new table type
我在尝试创建这样的新类型时遇到 PLS-00355
错误:
CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR(250) INDEX BY BINARY_INTEGER;
知道哪里出了问题吗?
非常感谢!
这是您所做的以及 Oracle 的回应:
SQL> CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR(250) INDEX BY BINARY_INTEGER;
2 /
Warning: Type created with compilation errors.
SQL> show err
Errors for TYPE DAYS_T:
LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 PL/SQL: Compilation unit analysis terminated
1/16 PLS-00355: use of pl/sql table not allowed in this context
另一方面:
SQL> CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR2(250);
2 /
Type created.
SQL>
回应您的评论:如果您在 PL/SQL 级别(而不是 SQL)声明类型,那么您的代码(尽管没有 create or replace
)就可以了(第 2 行)是你使用的字面意思):
SQL> declare
2 TYPE DAYS_T IS TABLE OF VARCHAR(250) INDEX BY BINARY_INTEGER;
3 begin
4 null;
5 end;
6 /
PL/SQL procedure successfully completed.
SQL>
您可以使用以下方法在 SQL 范围内定义嵌套 table 集合类型:
CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR(250);
您可以使用以下方法在 PL/SQL 范围内定义关联数组集合类型:
DECLARE
TYPE DAYS_T IS TABLE OF VARCHAR(250) INDEX BY BINARY_INTEGER;
BEGIN
NULL;
END;
/
您还可以使用以下方法在 PL/SQL 范围内本地定义嵌套的 table 集合类型:
DECLARE
TYPE DAYS_T IS TABLE OF VARCHAR(250);
BEGIN
NULL;
END;
/
但是,您不能在 SQL 范围内定义关联数组集合类型,因为它是 PL/SQL 唯一的数据类型。
您随后在评论中提问:
But how can I add an index?
他们都有索引。
例如,在 SQL 中声明类型后,您可以像这样在 PL/SQL 中使用嵌套的 table 集合:
DECLARE
v_days DAYS_T;
BEGIN
v_days := DAYS_T(); -- Initialise the collection.
v_days.EXTEND(3); -- Extend the collection by 3 elements.
v_days(1) := 'Monday'; -- Set the first element.
v_days(3) := 'Wednesday'; -- Set the third element.
FOR i IN 1 .. v_days.COUNT LOOP
DBMS_OUTPUT.PUT_LINE( i || ' = ' || v_days(i) );
END LOOP;
END;
/
输出:
1 = Monday
2 =
3 = Wednesday
db<>fiddle here
我在尝试创建这样的新类型时遇到 PLS-00355
错误:
CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR(250) INDEX BY BINARY_INTEGER;
知道哪里出了问题吗? 非常感谢!
这是您所做的以及 Oracle 的回应:
SQL> CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR(250) INDEX BY BINARY_INTEGER;
2 /
Warning: Type created with compilation errors.
SQL> show err
Errors for TYPE DAYS_T:
LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 PL/SQL: Compilation unit analysis terminated
1/16 PLS-00355: use of pl/sql table not allowed in this context
另一方面:
SQL> CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR2(250);
2 /
Type created.
SQL>
回应您的评论:如果您在 PL/SQL 级别(而不是 SQL)声明类型,那么您的代码(尽管没有 create or replace
)就可以了(第 2 行)是你使用的字面意思):
SQL> declare
2 TYPE DAYS_T IS TABLE OF VARCHAR(250) INDEX BY BINARY_INTEGER;
3 begin
4 null;
5 end;
6 /
PL/SQL procedure successfully completed.
SQL>
您可以使用以下方法在 SQL 范围内定义嵌套 table 集合类型:
CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR(250);
您可以使用以下方法在 PL/SQL 范围内定义关联数组集合类型:
DECLARE
TYPE DAYS_T IS TABLE OF VARCHAR(250) INDEX BY BINARY_INTEGER;
BEGIN
NULL;
END;
/
您还可以使用以下方法在 PL/SQL 范围内本地定义嵌套的 table 集合类型:
DECLARE
TYPE DAYS_T IS TABLE OF VARCHAR(250);
BEGIN
NULL;
END;
/
但是,您不能在 SQL 范围内定义关联数组集合类型,因为它是 PL/SQL 唯一的数据类型。
您随后在评论中提问:
But how can I add an index?
他们都有索引。
例如,在 SQL 中声明类型后,您可以像这样在 PL/SQL 中使用嵌套的 table 集合:
DECLARE
v_days DAYS_T;
BEGIN
v_days := DAYS_T(); -- Initialise the collection.
v_days.EXTEND(3); -- Extend the collection by 3 elements.
v_days(1) := 'Monday'; -- Set the first element.
v_days(3) := 'Wednesday'; -- Set the third element.
FOR i IN 1 .. v_days.COUNT LOOP
DBMS_OUTPUT.PUT_LINE( i || ' = ' || v_days(i) );
END LOOP;
END;
/
输出:
1 = Monday 2 = 3 = Wednesday
db<>fiddle here