【发布时间】:2016-01-26 22:47:35
【问题描述】:
是否可以使用动态同义词参数化存储过程中查询中使用的模式和表名?
我们尝试过的是
- 在名称/值对表中设置参数
- 在运行时读取这些参数以确定架构(和表名),因为目标会根据 应用
- 删除任何现有的同义词并重新创建架构和表
- 在查询中引用同义词
我们尝试这种方法的原因是因为要执行的查询是数百行长的合并语句,不适合动态 SQL。
【问题讨论】:
-
这是一个棘手的问题。如果删除同义词,所有使用同义词的存储过程都将失效。如果您还没有在当前会话中使用该过程,那应该不是问题。下次访问时会重新编译。如果您已经使用过它,您将遇到错误消息。因此,如果您采取额外的预防措施并妥善管理您的会话,这可能是可行的。
-
动态 SQL 没有理由只有简短的语句,您甚至可以使用 CLOB 来表示
EXECUTE IMMEDIATE。使用DBMS_SQL.VARCHAR2A,编写大型 SQL 语句非常简单。 -
可以,但就易于维护而言,这不是最佳解决方案。如果您动态创建语句并使用 oracle 内置插件,那么至少所有代码都在一个地方。通过创建同义词,这可能会导致名称冲突、安全性问题以及一个错误的不幸副作用会导致错误的内容被更改
标签: oracle stored-procedures dynamic plsql synonym