有什么方法可以重命名此游標處的表。
DECLARE
TYPE name_salary_rt IS RECORD (
name VARCHAR2 (1000),
salary NUMBER
);
TYPE name_salary_aat IS TABLE OF name_salary_rt
INDEX BY PLS_INTEGER;
l_employees name_salary_aat;
l_cursor SYS_REFCURSOR;
table_name = 'employees202110';
BEGIN
OPEN l_cursor FOR
q'[select first_name || ' ' || last_name, salary
from employees202110
order by salary desc]';
FETCH l_cursor BULK COLLECT INTO l_employees;
CLOSE l_cursor;
FOR indx IN 1 .. l_employees.COUNT
LOOP
DBMS_OUTPUT.put_line (l_employees (indx).name);
END LOOP;
END;
我想運行這個游標,但表名不同
table_name = 'employees202110';
OPEN l_cursor FOR
q'[select first_name || ' ' || last_name, salary
from ]' || table_name || q'[
order by salary desc]';
或者你推薦我以什么方式制作游標
uj5u.com熱心網友回復:
您走在正確的軌道上 - 正如您可能知道的那樣,您不能將識別符號名稱作為本機動態 sql 中的系結變數傳遞,因此連接是前進的方向。
但是,您應該檢查您所連接的內容是否實際上是一個識別符號名稱,否則您就會對 SQL 注入敞開大門。這可以使用 DBMS_ASSERT 來實作。
根據您傳遞 table_name 的方式,您可能想要使用DBMS_ASSERT.SIMPLE_SQL_NAME(如果您沒有傳遞架構名稱以及 table_name)或DBMS_ASSERT.QUALIFIED_SQL_NAME(如果您正在傳遞架構名稱或資料庫鏈接等),例如:
OPEN l_cursor FOR
q'[select first_name || ' ' || last_name, salary
from ]' || DBMS_ASSERT.SIMPLE_SQL_NAME(table_name) || q'[
order by salary desc]';
Tim Hall有一篇關于使用 DBMS_ASSERT 清理動態 SQL 輸入的好文章。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/338675.html
下一篇:CLOB資料型別超出限制
