sql - 如何从 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;
解决方案
为此,您将需要动态 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>
推荐阅读
- css - 修复 Windows 7 上的 Unicode 问题
- java - 在 thymeleaf 中使用 th:if 和 th:replcae 动态更改页面
- ruby-on-rails - Rails 5.2.2 web console does not show up
- javascript - React: Change component's children from the outside
- angularjs - How to return forEach in AngularJS?
- docker - Docker 容器默认操作系统和资源利用率
- mysql - 导入数据库很慢
- android - 当设备具有更大的字体大小时,react-native 的 webview 格式错误
- java - 通过包装 LinkedHashSet 实现 IdentityLinkedHashSet
- django - Can't render on base.html?