sql - 创建一个启用/禁用(取决于传递的参数)所有外键的存储过程(DB2,V10.5)

标签 sql linux stored-procedures db2 constraints

外键名称应该从系统表中动态获取。 这就是我现在所拥有的: “选择‘改变表’||tabname||'更改外键“||constname||”不强制执行;'来自 syscat.references”

以下代码输出这样的查询:

alter table ADDRESS alter foreign key SQL161110091657410 not enforced;
alter table ADDRESS alter foreign key SQL161110091748740 not enforced;
alter table CLIENT alter foreign key SQL161110092705870 not enforced;
alter table CLINIC alter foreign key SQL161110091917520 not enforced;
alter table DOCTOR alter foreign key SQL161110091133120 not enforced;
....

现在我需要在存储过程中执行这些查询(取决于传递的参数)。以下代码不正确,我附上它只是为了说明问题:

db2 "create procedure fk_switch (sw IN varchar(3)) 
   begin
   declare var1 varchar(100), var2 varchar(100)
   if sw='off' then @var1=select 'alter table ' ||tabname||' alter foreign key ' ||constname||' not enforced;' from syscat.references
   execute @var1
   elseif sw='on' then @var=select 'alter table ' ||tabname||' alter foreign key ' ||constname||' enforced;' from syscat.references
   execute @var2
   end if;
   end;"

如何将选择的结果写入变量?我可以在程序内执行它们吗?或者也许还有另一种解决方案?

是的,我知道,它可以通过使用 bash 来解决,但我的任务是创建一个存储过程:)

请分享一些关于 db2 存储过程的链接。

最佳答案

答案是您可以在您的过程中编写 SQL 字符串(如“var1”)并能够使用 EXECUTE 来运行它,但不会成功。使用存储过程无法解决您的问题。

看看是什么SQL statements are supported in SQL routines (函数、过程)您会注意到 ALTER TABLE 不受支持。

关于sql - 创建一个启用/禁用(取决于传递的参数)所有外键的存储过程(DB2,V10.5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40562237/

相关文章:

Mysql 如果不存在就会在存储过程中出现错误

php - 是否有一起工作的 phpFiddle 和 sqlFiddle?

php - MySQL Count 发生某事的计数

linux - 即使在创建时,vagrant 也永远无法 ssh 到我的 ubuntu 盒子。

windows - Linux Powershell 客户端

sql - 如何编写返回一组行的 postgres 函数?

MySQL - 存储过程或简单联接,根据过滤器和最大值将一个表中的值获取到另一个表中

mysql - SQL查询失败[密码更改]

SQLite/DB 浏览器中的 SQL 查询不返回任何值

c++ - 在 RHEL6 : How to distribute the software? 上用最近的 gcc 编译