繁体   English   中英

PL / SQL:创建对象

[英]PL/SQL: Creating objects

我必须创建一个PL / SQL包并且已经提供了一个示例包但是试图遵循它我无法创建一个对象

CREATE OR REPLACE TYPE OBJ_PERSONA_SIGNANT AS OBJECT (
    db_id                         NUMBER(6),
    usuaricreacio                 VARCHAR2(20),
    datacreacio                   VARCHAR2(25),
    nom                           VARCHAR2(25),
    signatura                     VARCHAR2(55),
    disponible                    BOOLEAN,);

CREATE OR REPLACE TBL_PERSONA_SIGNANT IS TABLE OF OBJ_PERSONA_SIGNANT;

但我仍然得到:

Error: PLS-00201: identifier 'OBJ_PERSONA_SIGNANT' must be declared

这不应该够吗? 老实说,我不知道为什么我会使用一个对象,而所有这些信息已经在一个表中,但新工作,新规则。

我猜我应该初始化它或者其他东西但是花了最后一小时试图找出我应该做什么/我应该做什么,而我的google-fu并不像以前那样:/

任何想法将不胜感激。

disponible                    BOOLEAN,);

在这里,你有一个额外的,在结束
Oracle再次没有布尔数据类型链接

将其更改为

disponible                   VARCHAR2(1));

尝试;

CREATE OR REPLACE TYPE OBJ_PERSONA_SIGNANT AS OBJECT (
    db_id                         NUMBER(6),
    usuaricreacio                 VARCHAR2(20),
    datacreacio                   VARCHAR2(25),
    nom                           VARCHAR2(25),
    signatura                     VARCHAR2(55),
    disponible                  VARCHAR2(1)
)
/ 

CREATE OR REPLACE
TYPE TBL_PERSONA_SIGNANT AS TABLE OF OBJ_PERSONA_SIGNANT
/

编辑
我怎么知道是否在架构上声明了?
使用ALL_TYPES视图

select * from ALL_TYPES
where owner = 'your_schema'
--first you need to check in user object of your type is VALID
select * from user_objects where object_type = 'TYPE' and object_name ='YOUR_TYPE_NAME'
--you can check moere details in user_types 
select * from user_types where type_name ='YOUR_TYPE_NAME'

--you will get type defination in follwing way
select text from user_source where name = 'V_TEMP' order by line
SELECT dbms_metadata.get_ddl('TYPE', 'V_TEMP') FROM DUAL;

最后,如果您使用像toad / plsql developer这样的开发人员工具,那么在编辑模式下打开该类型并尝试从工具窗口编译它。 在这里你会得到确切的错误,你可以纠正它。

您的TYPE创建中存在两个问题:

  1. 由于额外的逗号 ,最终会出现拼写错误
  2. 第二个语句中缺少TYPE 关键字

解决上述两个问题可以让您创建对象:

SQL> CREATE OR REPLACE TYPE OBJ_PERSONA_SIGNANT AS OBJECT (
  2      db_id                         NUMBER(6),
  3      usuaricreacio                 VARCHAR2(20),
  4      datacreacio                   VARCHAR2(25),
  5      nom                           VARCHAR2(25),
  6      signatura                     VARCHAR2(55),
  7      disponible                    VARCHAR2(1))
  8  /

Type created.

SQL> CREATE OR REPLACE TYPE TBL_PERSONA_SIGNANT IS TABLE OF OBJ_PERSONA_SIGNANT
  2  /

Type created.
Hey just made some minor modications  in your code and it works for me. Let me know if this helps.
DROP TYPE OBJ_PERSONA_SIGNANT;

CREATE OR REPLACE TYPE OBJ_PERSONA_SIGNANT AS OBJECT (
    db_id                         NUMBER(6),
    usuaricreacio                 VARCHAR2(20),
    datacreacio                   VARCHAR2(25),
    nom                           VARCHAR2(25),
    signatura                     VARCHAR2(55),
    disponible                    VARCHAR2(10) -- ut may contain 'TRUE' or 'FALSE' wich can be manipulated accrordingly
    );

DROP TYPE TBL_PERSONA_SIGNANT;

CREATE OR REPLACE TYPE TBL_PERSONA_SIGNANT IS TABLE OF OBJ_PERSONA_SIGNANT;

首先,我要感谢大家的意见。 你给了我足够的信息来自己找到问题。

由于声明写得很好(由你们检查),我意识到我并没有将它放在应有的位置。

对于未来可能会发现这种情况的任何pl / sql开发人员:对象未在包内定义,您必须转到对象浏览器上的类型并从那里做一个“新”!

再次,谢谢大家!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM