SELECT cols.column_name
FROM all_constraints cons NATURAL JOIN all_cons_columns cols
WHERE cons.constraint_type = 'P' AND table_name = UPPER('METADATA_TAB');
我正在獲取主鍵欄位,但我想使用主鍵欄位從 METADATA_TAB 表中檢索資料。
我期望主鍵欄位和資料都應該顯示。
任何人都可以提供幫助。謝謝。
uj5u.com熱心網友回復:
這是一個演示。
表包含一個復合主鍵(這意味著最終結果應該包含所有涉及的列,而不僅僅是一個)。
SQL> CREATE TABLE test
2 AS
3 SELECT deptno,
4 empno,
5 ename,
6 job
7 FROM emp
8 WHERE deptno = 10;
Table created.
SQL> ALTER TABLE test
2 ADD CONSTRAINT pk_test PRIMARY KEY (deptno, empno);
Table altered.
接受表名作為引數并回傳 refcursor 作為結果的函式;listagg函式回傳所有主鍵列的逗號分隔串列。如果沒有主鍵,函式會引發例外。
SQL> CREATE OR REPLACE FUNCTION f_get (par_table_name IN VARCHAR2)
2 RETURN SYS_REFCURSOR
3 IS
4 l_pk_cols VARCHAR2 (100);
5 l_str VARCHAR2 (1000);
6 rc SYS_REFCURSOR;
7 BEGIN
8 SELECT LISTAGG (cols.column_name, ', ')
9 WITHIN GROUP (ORDER BY cols.position)
10 INTO l_pk_cols
11 FROM all_constraints cons NATURAL JOIN all_cons_columns cols
12 WHERE cons.constraint_type = 'P'
13 AND table_name =
14 DBMS_ASSERT.sql_object_name (UPPER (par_table_name));
15
16 IF l_pk_cols IS NULL
17 THEN
18 raise_application_error (-20000,
19 'That table does not have a primary key');
20 ELSE
21 l_str := 'select ' || l_pk_cols || ' from ' || par_table_name;
22
23 OPEN rc FOR l_str;
24
25 RETURN rc;
26 END IF;
27 END;
28 /
Function created.
測驗:
SQL> SELECT f_get ('test') FROM DUAL;
F_GET('TEST')
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
DEPTNO EMPNO
---------- ----------
10 7782
10 7839
10 7934
SQL> SELECT f_get ('mytable') FROM DUAL;
SELECT f_get ('mytable') FROM DUAL
*
ERROR at line 1:
ORA-20000: That table does not have a primary key
ORA-06512: at "SCOTT.F_GET", line 18
SQL>
在 SQL Developer 中,如果你想看到更漂亮的輸出,那么
- 雙擊結果集中的任意位置
- 點擊鉛筆按鈕
- 看結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/432920.html
下一篇:oracle中的索引重繪
