簡體   English   中英

如何在 Oracle 數據庫中運行由 SELECT 語句重新調整的查詢

[英]How to run a query retuned by SELECT statement in Oracle database

我正在使用 Oracle 數據庫,並且我有這個生成Alter Table語句的查詢

(SELECT 'ALTER TABLE drop CONSTRAINT '
           ||constraint_name
           ||' ;'
FROM   user_constraints
WHERE  constraint_type = 'R'
AND    table_name = 'PRINCIPALS_ROLES'
AND    r_constraint_name =
    (
           SELECT constraint_name
           FROM   user_constraints
           WHERE  table_name = 'PRINCIPALS'
           AND    constraint_type= 'P' ))

當我運行此查詢時,我得到以下輸出。

ALTER TABLE drop CONSTRAINT PRINCIPAL_ID_FKEY ;

現在我想在生成這個查詢的同一個 sql 語句中運行上面的查詢。 我們應該怎么做? 不想使用像 Declare --> Begin --> End 這樣的存儲過程 我希望我的查詢是單個可執行查詢。

你有一個 DDL 並且執行它需要動態執行立即,這不能在單個語句中完成。 您將需要至少 2 個語句,並且立即執行需要一個BEGIN END塊。

我不想使用像 Declare --> Begin --> End 這樣的存儲過程。 我希望我的查詢是單個可執行查詢。

不幸的是,並非所有夢想都能實現。 恐怕這是其中之一。 因為,您所描述的是一個經典的動態 SQL 示例,它需要某種 PL/SQL; 示例顯示了一個存儲過程,因此您可以只使用一條語句來運行它。

示例表:

SQL> create table principals (id number constraint pk_princ primary key);

Table created.

SQL> create table principals_roles
  2    (id         number constraint pk_princ_role primary key,
  3     id_master  number constraint fk_prole_princ references principals (id));

Table created.

虛擬程序; 您可能希望重用它,因此您至少將表名作為參數傳遞。

SQL> create or replace procedure p_drop as
  2  begin
  3    for cur_r in (select
  4                    'ALTER TABLE ' || table_name || ' drop CONSTRAINT ' ||
  5                     constraint_name as command
  6                  from user_constraints
  7                  where constraint_type = 'R'
  8                    and table_name = 'PRINCIPALS_ROLES'
  9                    and r_constraint_name = (select constraint_name
 10                                             from user_constraints
 11                                             where table_name = 'PRINCIPALS'
 12                                               and constraint_type = 'P'
 13                                            )
 14                 ) loop
 15      dbms_output.put_line(cur_r.command);
 16      execute immediate cur_r.command;
 17    end loop;
 18  end;
 19  /

Procedure created.

測試:

SQL> set serveroutput on;
SQL> exec p_drop;
ALTER TABLE PRINCIPALS_ROLES drop CONSTRAINT FK_PROLE_PRINC

PL/SQL procedure successfully completed.

如果一切正常, principals_roles現在應該只有它的主鍵約束:

SQL> select constraint_name from user_constraints where table_name = 'PRINCIPALS_ROLES';

CONSTRAINT_NAME
--------------------------------------------------------------------------------
PK_PRINC_ROLE

SQL>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM