如何查询所有包含FID列的表中的对应FID字段值
解决方案
核心思路是通过动态SQL拼接查询语句,Oracle场景下使用PL/SQL即可快速实现,步骤如下:
可直接运行的PL/SQL实现
以下代码会自动查询所有包含FID列的表,拼接UNION ALL语句后执行并输出所有FID值:
DECLARE v_sql CLOB := ''; BEGIN -- 遍历所有包含FID列的用户表,拼接动态查询语句 FOR t IN (SELECT table_name FROM user_tab_cols WHERE column_name = 'FID') LOOP IF v_sql IS NOT NULL THEN v_sql := v_sql || ' UNION ALL '; END IF; -- DBMS_ASSERT.ENQUOTE_NAME 用于规避SQL注入风险、兼容特殊字符表名 v_sql := v_sql || 'SELECT FID FROM ' || DBMS_ASSERT.ENQUOTE_NAME(t.table_name); END LOOP; -- 调试用:打印生成的完整SQL语句,不需要可以注释 DBMS_OUTPUT.PUT_LINE('生成的查询语句:' || CHR(10) || v_sql); -- 执行动态SQL并输出结果 DECLARE -- 若FID为其他类型(如字符串),此处将NUMBER修改为对应类型即可,例如VARCHAR2(200) TYPE fid_list IS TABLE OF NUMBER INDEX BY PLS_INTEGER; v_all_fids fid_list; BEGIN EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_all_fids; FOR i IN 1..v_all_fids.COUNT LOOP DBMS_OUTPUT.PUT_LINE(v_all_fids(i)); END LOOP; END; END; /
注意事项
- 若需要查询其他用户下的表,可将
user_tab_cols替换为all_tab_cols,同时新增过滤条件AND owner = '目标用户名'(用户名需要大写)。 - 若表数量极多导致拼接的SQL长度超限,可拆分批次执行查询即可。
扩展:可直接查询的函数版本
如果需要把结果作为表供其他SQL调用,可创建管道函数实现:
-- 第一步:创建返回结果的对象类型 CREATE OR REPLACE TYPE fid_obj AS OBJECT (fid NUMBER); -- 匹配实际FID的类型 / -- 第二步:创建对象的集合类型 CREATE OR REPLACE TYPE fid_tab AS TABLE OF fid_obj; / -- 第三步:创建管道函数 CREATE OR REPLACE FUNCTION get_all_fids RETURN fid_tab PIPELINED IS v_sql CLOB := ''; v_cursor SYS_REFCURSOR; v_fid NUMBER; -- 匹配实际FID的类型 BEGIN FOR t IN (SELECT table_name FROM user_tab_cols WHERE column_name = 'FID') LOOP IF v_sql IS NOT NULL THEN v_sql := v_sql || ' UNION ALL '; END IF; v_sql := v_sql || 'SELECT FID FROM ' || DBMS_ASSERT.ENQUOTE_NAME(t.table_name); END LOOP; OPEN v_cursor FOR v_sql; LOOP FETCH v_cursor INTO v_fid; EXIT WHEN v_cursor%NOTFOUND; PIPE ROW(fid_obj(v_fid)); END LOOP; CLOSE v_cursor; RETURN; END; /
函数创建完成后,直接执行以下语句即可得到所有FID值:
SELECT * FROM TABLE(get_all_fids);
内容的提问来源于stack exchange,提问作者Pierre de la Verre
相关产品推荐
相关产品推荐

