Oracle
用 SQL 生成 SQL
我正在嘗試使用 SQL 生成 SQL 語句來創建 SQL 程式碼,這些程式碼將突出顯示並由管理員執行以處理該語句。我的問題是我創建的程式碼。目前它效率不高,因為它使用的是固定值。
有沒有辦法讓程式碼自動生成一個為使用者生成多個語句的腳本,通過循環遍歷我的使用者表並提取使用者名,將這些值放入聲明的變數中
U_USERNAME
?我必須使用
SELECT INTO
變數U_USERNAME
嗎?在這種情況下,這看起來語法如何?DECLARE u_perm VARCHAR2(25); u_table VARCHAR2(25); u_username VARCHAR2(25); u_code VARCHAR2(2000); BEGIN u_perm := 'INSERT'; u_username := 'J123'; u_table := 'TABLE_NAME'; u_code :=''; dbms_output.put_line('Grant ' || u_perm || ' on ' || u_table || ' to ' || u_username || ';' ); u_code := ('Grant ' || u_perm || ' on ' || u_table || ' to ' || u_username || ';') ; dbms_output.put_line ('u_code = ' || u_code|| ''); END;
—將儲存我將嘗試從中提取的使用者名的使用者表。
CREATE TABLE tblss_user( user_id INTEGER NOT NULL, user_name VARCHAR(15), reg_date DATE
您應該授予角色,而不是個人。一個例外:一個模式正在創建引用另一個模式表的程式碼。
一次授予多個模式/角色
這是合法程式碼:GRANT INSERT ON SCOTT.EMP TO ADAMS,ALLEN;
如果您使用的是 11g 或更高版本,則可以使用LISTAGG()生成逗號分隔列表
declare local_variable varchar2(2000); begin select listagg( e.ename,',' ) within group (order by e.empno) into local_variable from scott.emp e where e.ename like 'A%'; end; /
但是,您需要限制行數。如果超過一定長度,LISTAGG 會出錯(例如 11g 的 4000 字節)
循環
你會想在你的桌子上循環:
begin for curr in ( select e.ename from scott.emp e order by e.ename) loop dbms_output.put_line( 'grant for ' || curr.ename ); end loop; end; /
碩士技術
好的好的。這是我的技術。(也許是其他人)
使用眾多免費提供的基於模板的程式碼生成器之一。這可能僅在您要在創建新表時重複循環執行此操作時才有用。
同樣,您應該授予角色,而不是個人使用者。