如何编写可以针对给定数据库链接执行的整洁的PL / sql存储过程?
它变得非常混乱,写这样的东西:
PROCEDURE my_proc(aDbLink IN VARCHAR2) IS BEGIN EXECUTE IMMEDIATE ' SELECT mycolumn,anothercolumn FROM MYTABLE@' || aDbLink || ' WHERE such-and-such...' END
随着查询变大.
解决方法
避免使用动态sql的最简单方法是创建同义词.
CREATE OR REPLACE SYNONYM MyTableRemote FOR MyTable@database_link
然后,您的存储过程将简单地引用同义词MyTableRemote.然后,您可以使用单独的方法将数据库链接名称作为参数,并将所有同义词更改为指向数据库链接.
PROCEDURE replace_synonyms( p_db_link IN VARCHAR2 ) AS BEGIN -- Adjust the query to identify all the synonyms that you want to recreate FOR syn IN (SELECT * FROM user_synonyms WHERE db_link IS NOT NULL) LOOP EXECUTE IMMEDIATE 'CREATE OR REPLACE SYNONYM ' || syn.synonym_name || ' FOR ' || syn.table_owner || '.' || syn.table_name || '@' || p_db_link; END LOOP; END;