簡體   English   中英

Oracle PL/SQL 傳遞行類型作為構造函數參數

[英]Oracle PL/SQL Pass row type as constructor parameter

是否可以在構造函數中將 table%rowtype 作為參數傳遞?

我有這樣的東西,這有效

CREATE OR REPLACE TYPE shape AS OBJECT (
    name VARCHAR2(30),
    area NUMBER,
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2)
                               RETURN SELF AS RESULT,
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2, 
                               area NUMBER) RETURN SELF AS RESULT
) NOT FINAL;
/

CREATE OR REPLACE TYPE BODY shape AS
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2) 
                               RETURN SELF AS RESULT IS
    BEGIN
        SELF.name := name;
        SELF.area := 0;
        RETURN;
    END;
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2, 
                                area NUMBER) RETURN SELF AS RESULT IS
    BEGIN
        SELF.name := name;
        SELF.area := area;
        RETURN;
    END;
END;
/

但是我也需要傳遞一個 table%row 作為參數

CREATE OR REPLACE TYPE shape AS OBJECT (
    name VARCHAR2(30),
    area NUMBER,
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2)
                               RETURN SELF AS RESULT,
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2, 
                               area NUMBER) RETURN SELF AS RESULT,
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, ctrl CONTROL%ROWTYPE) RETURN SELF AS RESULT
) NOT FINAL;
/

CREATE OR REPLACE TYPE BODY shape AS
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2) 
                               RETURN SELF AS RESULT IS
    BEGIN
        SELF.name := name;
        SELF.area := 0;
        RETURN;
    END;
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2, 
                                area NUMBER) RETURN SELF AS RESULT IS
    BEGIN
        SELF.name := name;
        SELF.area := area;
        RETURN;
    END;
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, ctrl CONTROL%ROWTYPE) RETURN SELF AS RESULT IS
    BEGIN
        SELF.area := NULL;
        RETURN;
    END;
END;
/

LINE/COL 錯誤


0/0 PL/SQL:編譯單元分析終止 8/63 PLS-00329:模式級類型對 SCHEMA_A.CONTROL 有非法引用錯誤:檢查編譯器日志

類型 Body SHAPE 編譯

LINE/COL 錯誤


0/0 PL/SQL:編譯單元分析終止 1/11 PLS-00905:object SCHEMA_A.SHAPE 無效 1/11 PLS-00304:沒有規范就無法編譯“SHAPE”的主體錯誤:檢查編譯器日志

這樣的事情可能嗎?

如果你想采取稍微不同的方法,你可以創建一個對象表

CREATE TYPE control_type AS OBJECT (
  id NUMBER(8,0),
  name VARCHAR2(30),
  area NUMBER
);

CREATE TABLE control OF control_type(
  CONSTRAINT control__id__pk PRIMARY KEY (id)
);

INSERT INTO control (id, name, area)
SELECT 1, 'square', 42 FROM DUAL;

然后,您可以傳遞該表的基礎對象類型,而不是在游標中期望%ROWTYPE

CREATE OR REPLACE TYPE shape AS OBJECT (
    name VARCHAR2(30),
    area NUMBER,
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2)
                               RETURN SELF AS RESULT,
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2, 
                               area NUMBER) RETURN SELF AS RESULT,
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, ctrl control_type) RETURN SELF AS RESULT
) NOT FINAL;
/

CREATE OR REPLACE TYPE BODY shape AS
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2) 
                               RETURN SELF AS RESULT IS
    BEGIN
        SELF.name := name;
        SELF.area := 0;
        RETURN;
    END;
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2, 
                                area NUMBER) RETURN SELF AS RESULT IS
    BEGIN
        SELF.name := name;
        SELF.area := area;
        RETURN;
    END;
    CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, ctrl control_type) RETURN SELF AS RESULT IS
    BEGIN
        SELF.name := ctrl.name;
        SELF.area := ctrl.area;
        RETURN;
    END;
END;
/

然后,您可以在對象表的SELECT使用VALUE(column_alias)將表的基礎對象類型傳遞給構造函數:

SELECT s.shape.area,
       s.shape.name
FROM   (
  SELECT SHAPE(VALUE(c)) AS shape
  FROM   control c
) s;

輸出:

\n形狀.區域 | 形狀名稱\n ---------: |  :---------\n         42 | 正方形    \n

db<> 在這里擺弄

如果此記錄類型僅分配字段的子集 1:1,您可以執行此操作

  1. 定義構造方法
CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, ctrl shape) RETURN SELF AS RESULT,
  1. 或者簡單地定義另一個具有您需要的字段的對象,並在您的構造函數中使用它插入 %rowtype
CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, ctrl t_control_rec) RETURN SELF AS RESULT,

這是記錄類型定義

CREATE TYPE t_control_rec AS OBJECT (
  id NUMBER
  name VARCHAR2(30),
  area NUMBER
);
/

這是第一種方法的演示:

SET SERVEROUTPUT ON;

DECLARE
    l_base_shape    shape := shape('square', 42);
    l_ctrl_shape    shape; --l_control_rec   t_control_rec; 
BEGIN
    l_base_shape.display();
    WITH imaginary_table AS (
        SELECT 1 id, 'tesseract' name, 2048 area
        FROM dual
    )
    SELECT shape(it.name, it.area) --t_control_rec(it.name, it.area)
    INTO l_ctrl_shape
    FROM imaginary_table it;

    l_ctrl_shape.display();                     
    l_base_shape := shape(l_ctrl_shape);
    l_base_shape.display();
END;
/

添加了額外的方法 shape.display()

    member procedure display is
    begin
      dbms_output.put_line(self.name|| ':'|| self.area);  
    end;

*它與@MT0 方法非常相似,但沒有帶有基於對象記錄的表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM