【问题标题】:PL/SQL create object inside a anonymous blockPL/SQL 在匿名块内创建对象
【发布时间】:2014-12-09 15:38:48
【问题描述】:

我是 Oracle SQL DEVELOPER 的新手,无法在匿名块内创建对象。 在本页Oracle Database Object-Relational Developer's Guide

    CREATE TYPE address_typ AS OBJECT ( 
   street          VARCHAR2(30),
   city            VARCHAR2(20),
   state           CHAR(2),
   postal_code     VARCHAR2(6) );
/
CREATE TYPE employee_typ AS OBJECT (
  employee_id       NUMBER(6),
  first_name        VARCHAR2(20),
  last_name         VARCHAR2(25),
  email             VARCHAR2(25),
  phone_number      VARCHAR2(20),
  hire_date         DATE,
  job_id            VARCHAR2(10),
  salary            NUMBER(8,2),
  commission_pct    NUMBER(2,2),
  manager_id        NUMBER(6),
  department_id     NUMBER(4),
  address           address_typ,
  MAP MEMBER FUNCTION get_idno RETURN NUMBER,
  MEMBER PROCEDURE display_address ( SELF IN OUT NOCOPY employee_typ ) );
/
CREATE TYPE BODY employee_typ AS
  MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
  BEGIN
    RETURN employee_id;
  END;
  MEMBER PROCEDURE display_address ( SELF IN OUT NOCOPY employee_typ ) IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(first_name || ' '  || last_name);
    DBMS_OUTPUT.PUT_LINE(address.street);
    DBMS_OUTPUT.PUT_LINE(address.city || ', '  || address.state || ' ' ||
                         address.postal_code);   
  END;
END;
/
CREATE TABLE employee_tab OF employee_typ;

还有……

--Requires the top code
DECLARE
  emp employee_typ; -- emp is atomically null
BEGIN
-- call the constructor for employee_typ
  emp := employee_typ(315, 'Francis', 'Logan', 'FLOGAN',
        '415.555.0100', '01-MAY-04', 'SA_MAN', 11000, .15, 101, 110, 
         address_typ('376 Mission', 'San Francisco', 'CA', '94222'));
  DBMS_OUTPUT.PUT_LINE(emp.first_name || ' ' || emp.last_name); -- display details
  emp.display_address();  -- call object method to display details
END;
/

有 2 个单独的代码块(示例 3-1 使用对象类型和示例 3-2 在 PL/SQL 块中声明对象)。我怎样才能把它全部放在一个匿名块中?

我不能在匿名块的范围内创建对象,使用它然后他们将其删除吗?

【问题讨论】:

    标签: object plsql block anonymous


    【解决方案1】:

    您不能在匿名块内执行直接 DDL。您应该使用动态 SQL:

    declare
      l_sql varchar2(2000);
    begin
      l_sql := 'CREATE TYPE address_typ AS OBJECT ( 
       street          VARCHAR2(30),
       city            VARCHAR2(20),
       state           CHAR(2),
       postal_code     VARCHAR2(6) )';
    
      execute immediate l_sql;
    
    end;
    

    因此,将您的每个“创建类型”放入动态 SQL 中,它应该可以满足您的需求!

    【讨论】:

      【解决方案2】:

      如果你只需要一个临时数据结构,你可以在块级声明中使用记录类型,可读性和限制较少,但可以用于一些简单的东西

      declare
      
        type address_typ is record(
         street          VARCHAR2(30),
         city            VARCHAR2(20),
         state           CHAR(2),
         postal_code     VARCHAR2(6)  
        );
      
        TYPE employee_typ is record (
          employee_id       NUMBER(6),
          first_name        VARCHAR2(20),
          last_name         VARCHAR2(25),
          email             VARCHAR2(25),
          phone_number      VARCHAR2(20),
          hire_date         DATE,
          job_id            VARCHAR2(10),
          salary            NUMBER(8,2),
          commission_pct    NUMBER(2,2),
          manager_id        NUMBER(6),
          department_id     NUMBER(4),
          address           address_typ/*,
          MAP MEMBER FUNCTION get_idno RETURN NUMBER,
          MEMBER PROCEDURE display_address ( SELF IN OUT NOCOPY employee_typ ) */
        );
      
        emp employee_typ;
      
      begin 
        emp.employee_id := 315;
        emp.first_name := 'Francis';
        emp.last_name := 'Logan';
        --and so on for the others fields
      
        emp.address.street := '376 Mission';
        emp.address.city := 'San Francisco';
        emp.address.state := 'CA';
        emp.address.postal_code := '94222';
      
        DBMS_OUTPUT.PUT_LINE(emp.first_name || ' ' || emp.last_name);
        --no member available so you have to print each field
        DBMS_OUTPUT.PUT_LINE(emp.address.street);
        DBMS_OUTPUT.PUT_LINE(emp.address.city || ', '  || emp.address.state || ' ' ||  emp.address.postal_code);  
      end;
      

      【讨论】:

        猜你喜欢
        • 2017-01-29
        • 2014-09-30
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-09
        • 2011-09-17
        相关资源
        最近更新 更多