首页 > 解决方案 > 如何从 Oracle DB 中传递的参数中获取表名?

问题描述

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

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;

标签: sqloracleplsqloracle11g

解决方案


为此,您将需要动态 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>

推荐阅读