Oracle

用 SQL 生成 SQL

  • March 3, 2018

我正在嘗試使用 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;
/

碩士技術

好的好的。這是我的技術。(也許是其他人)

使用眾多免費提供的基於模板的程式碼生成器之一。這可能僅在您要在創建新表時重複循環執行此操作時才有用。

同樣,您應該授予角色,而不是個人使用者。

引用自:https://dba.stackexchange.com/questions/199176