【问题标题】:How can I get table name from passed parameter in Oracle DB?如何从 Oracle DB 中传递的参数中获取表名?
【发布时间】:2020-02-14 00:31:04
【问题描述】:

我用(In parameter)在oracle db中创建了一个函数,参数决定了我在调用函数时传递了什么表,所以我需要从参数中获取表名并在函数内部的查询中使用它。示例如下:

CREATE OR REPLACE TYPE EMP_OBJ_TYPE AS OBJECT

(

column1 varchar2(20),

column2 varchar2(20),

column3 varchar2(20)

)
;

CREATE OR REPLACE TYPE EMP_TBL_TYPE IS TABLE OF EMP_OBJ_TYPE;

CREATE OR REPLACE FUNCTION EMPLOYEE_FUNCTION (table_name varchar2)

RETURN EMP_TBL_TYPE IS

EMP_DETAILS EMP_TBL_TYPE := EMP_TBL_TYPE();

BEGIN

EMP_DETAILS.EXTEND();

SELECT EMP_OBJ_TYPE (column1, column2, colmn3)

BULK COLLECT
INTO EMP_DETAILS

FROM (SELECT column1, column2, column3

From emloyees a

join table_name b

on a.emp_id = b.emp_id);

RETURN EMP_DETAILS;

END;

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    为此,您需要动态 SQL。方法如下:我正在使用 Scott 的示例模式,试图模仿你所拥有的。

    SQL> CREATE TABLE employees
      2  AS
      3     SELECT deptno emp_id,
      4            ename column1,
      5            job column2,
      6            TO_CHAR (hiredate, 'dd.mm.yyyy') column3
      7       FROM emp;
    
    Table created.
    

    你的类型:

    SQL> CREATE OR REPLACE TYPE emp_obj_type AS OBJECT
      2  (
      3     column1 VARCHAR2 (20),
      4     column2 VARCHAR2 (20),
      5     column3 VARCHAR2 (20)
      6  );
      7  /
    
    Type created.
    
    SQL> CREATE OR REPLACE TYPE emp_tbl_type IS TABLE OF emp_obj_type;
      2  /
    
    Type created.
    

    功能:最好先显示您将要执行的语句,以直观地验证它是否正确(第 14 行);不再需要时将其删除。

    SQL> CREATE OR REPLACE FUNCTION employee_function (par_table_name VARCHAR2)
      2     RETURN emp_tbl_type
      3  IS
      4     emp_details  emp_tbl_type := emp_tbl_type ();
      5     l_str        VARCHAR2 (1000);
      6  BEGIN
      7     l_str :=
      8           'SELECT EMP_OBJ_TYPE (column1, column2, column3) '
      9        || '  FROM (SELECT column1, column2, column3 '
     10        || '        FROM employees a JOIN '
     11        || par_table_name
     12        || ' b ON a.emp_id = b.deptno)';
     13
     14     -- DBMS_OUTPUT.put_line (l_str);
     15
     16     EXECUTE IMMEDIATE l_str BULK COLLECT INTO emp_details;
     17
     18     RETURN emp_details;
     19  END;
     20  /
    
    Function created.
    

    测试:

    SQL> SELECT employee_function ('dept') FROM DUAL;
    
    EMPLOYEE_FUNCTION('DEPT')(COLUMN1, COLUMN2, COLUMN3)
    --------------------------------------------------------------------------------
    EMP_TBL_TYPE(EMP_OBJ_TYPE('SMITH', 'CLERK', '17.12.1980'), EMP_OBJ_TYPE('ALLEN',
     'SALESMAN', '20.02.1981'), EMP_OBJ_TYPE('WARD', 'SALESMAN', '22.02.1981'), EMP_
    OBJ_TYPE('JONES', 'MANAGER', '02.04.1981'), EMP_OBJ_TYPE('MARTIN', 'SALESMAN', '
    28.09.1981'), EMP_OBJ_TYPE('BLAKE', 'MANAGER', '01.05.1981'), EMP_OBJ_TYPE('CLAR
    K', 'MANAGER', '09.06.1981'), EMP_OBJ_TYPE('SCOTT', 'ANALYST', '09.12.1982'), EM
    P_OBJ_TYPE('KING', 'PRESIDENT', '17.11.1981'), EMP_OBJ_TYPE('TURNER', 'SALESMAN'
    , '08.09.1981'), EMP_OBJ_TYPE('ADAMS', 'CLERK', '12.01.1983'), EMP_OBJ_TYPE('JAM
    ES', 'CLERK', '03.12.1981'), EMP_OBJ_TYPE('FORD', 'ANALYST', '03.12.1981'), EMP_
    OBJ_TYPE('MILLER', 'CLERK', '23.01.1982'))
    
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多