【问题标题】:How do I declare my select query in PL/SQL?如何在 PL/SQL 中声明我的选择查询?
【发布时间】:2018-06-27 06:12:37
【问题描述】:

我想声明一个选择查询以在触发器中使用它,但我一般是 sql 中的菜鸟:P 有人可以帮助我吗?

我的代码(示例):

DECLARE Primary_Keys VARCHAR(20);
BEGIN
SELECT cons.constraint_type 
FROM all_constraints cons, all_cons_columns cols 
WHERE cols.owner = 'DAB_NAME' 
AND cons.constraint_type = 'P' 
AND cons.constraint_name = cols.constraint_name 
AND cons.owner = cols.owner;
END;

【问题讨论】:

  • 你想在触发器中用它做什么?有比将查询存储在变量中更好的方法。
  • 我的任务是创建一个函数/触发器(不管它是什么,只要它可以工作,我正在尝试使用触发器),如果我尝试,它会向主键添加一个值合并两个主键相同的数据库。我正在尝试通过通过 constraint_table 选择表中的所有 pk 并通过随机值对它们进行计数来解决该任务。
  • 对于您要解决的实际问题,更好的解决方案是在合并的数据库中创建一个新序列并覆盖原始主键。您可能需要在审计表中记录原始主键和新主键(取决于您的整体要求)。

标签: oracle select plsql declare


【解决方案1】:

您可以使用由 BULK COLLECTFORALL 组成的 PROCEDURE

SQL> set serveroutput on;
SQL> CREATE OR REPLACE PROCEDURE pr_list_constraints(
                              i_owner IN all_cons_columns.owner%TYPE
                              ) 
IS
BEGIN
      DBMS_OUTPUT.PUT_LINE('Constraint Types for '||i_owner);
      DBMS_OUTPUT.PUT_LINE('------------------------------- ');
   FOR constraint_rec
      IN (SELECT distinct cons.constraint_type 
            FROM all_constraints cons, all_cons_columns cols 
           WHERE cols.owner = i_owner --'DAB_NAME' 
           --AND cons.constraint_type = 'P'
             AND cons.constraint_name = cols.constraint_name 
             AND cons.owner = cols.owner)
   LOOP
      DBMS_OUTPUT.PUT_LINE(constraint_rec.constraint_type);
   END LOOP;
END;
/
SQL> var p_owner varchar2(50);
SQL> exec pr_list_constraints(:p_owner);

 Constraint Types for DAB_NAME 
 -------------------------------
 R
 U
 P
 C

附:使用 DB 触发器与此类任务无关。

【讨论】:

  • 如果我尝试执行您的程序,则会出现以下错误: Fehlerbericht - ORA-06550: Zeile 7, Spalte 39: PL/SQL: ORA-00933: SQL-Befehl wurde nicht korrekt bedet ORA-06550 : Zeile 5, Spalte 11: PL/SQL: SQL 语句被忽略 06550. 00000 - "line %s, column %s:\n%s" *原因:通常是 PL/SQL 编译错误。 *行动:
  • @AnSuS 对不起,我忘了在PROCEDURE 之前添加CREATE OR REPLACE。现在,没关系。请重试。
  • 谢谢程序工作正常!但是命令: exec pr_list_constraints(:p_owner);给我们的错误:缺少定义
  • @AnSuS 不客气。您是否通过var p_owner varchar2(50); 定义了 p_owner?
  • @AnSuS 在定义 p_owner 问题 exec pr_list_constraints(:p_owner); 或直接发出 exec pr_list_constraints('DAB_NAME'); 之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多