我正在尝试编写一个PL/SQL脚本,该脚本读取表并基于rule_id
和parameter_id
生成动态查询。
我的脚本应该基于规则ID和参数ID从parameter_value
读取,并在动态查询中使用参数值。
我的表rules
看起来像这样:
这是我的脚本-我做错了什么?我得到了一个错误
ORA-01747无效的用户.表.列、表.列或列说明
declare
v_rule_id number(10);
v_parameter_id number(10);
v_parameter_value varchar2(100);
v_source_table varchar2(100);
v_lookup_table varhcar2(100);
v_source_column varchar2(100);
v_lookup_column varchar2(100);
v_date varhchar2(100);
v_query varchar2(1000);
BEGIN
FOR RL IN (SELECT RULE_ID FROM RULE)
LOOP
FOR PRM IN (SELECT PARAMETER_ID,PARAMETER_VALUE FROM RULE)
LOOP
IF PRM.PARAM_ID = 1 THEN
v_source_table:= PRM.PARAMETER_VALUE;
ELSIF PRM.PARAM_ID = 2 THEN
V_lookup_table := PRM.PARAMETER_VALUE;
ELSIF PRM.PARAM_ID = 3 THEN
V_source_column := PRM.PARAMETER_VALUE;
ELSIF PRM.PARAM_ID = 4 THEN
V_lookup_column := PRM.PARAMETER_VALUE;
ELSIF PRM.PARAM_ID = 5 THEN
V_date := PRM.PARAMETER_VALUE;
END IF;
v_query := 'SELECT * FROM (SELECT DISTINCT A.' || v_source_column || ', count(*) as count from'|| v_source_table || ' A LEFT JOIN' || V_lookup_table || ' ON A.'||V_source_column ||' = B.'|| V_lookup_column || 'WHERE B.'||V_lookup_table||' IS NULL GROUP BY A.'||V_source_column ||'ORDER BY 2 DESC' );
EXECUTE IMMEDIATE v_query;
END LOOP;
END LOOP;
END;
2条答案
按热度按时间lmvvr0a81#
好吧......调试一下,你就会发现问题出在哪里。
dbms_output.put_line
(或日志框架,如logger)来检测代码。享受下面的调试过程!
手动创建样本数据,因为海报提供了一个截图。请提供这个代码自己下次-这是你的工作,而不是我们的。
运行上面的代码:
修复第28行运行块中的错误
修复第6行运行块中的错误
修复第8行运行块中的错误
将出现的PARAM_ID替换为PARAMETER_ID,运行块
啊...我们得到了错误!
下面是给出原始错误的代码:
现在是时候做正确的调试了,注解掉
EXECUTE IMMEDIATE v_query;
并替换adddbms_output.put_line(v_query);
,看看你要执行什么。* * 许多行**如:sql语句是(1)不完整的,(2)关键字是串联的,而且有太多的行。内部循环和外部循环都做了一个完整的选择。
...一些工作...
最终溶液:
如果每个select语句中的所有表实际上都存在于数据库中,则这将成功执行。
hgc7kmma2#
如果您可以不用PL/SQL而只使用普通SQL来获得查询会怎样?
假设您的两个表如下所示:
......而且你的规则是这样设置的
如果我们使用CTE(命名参数)透视和取消透视规则_
生成的数据集包含构造不同SQL命令所需的一切。这里,对于RULE_ID = 1,将有SQL用于左连接表和选择不匹配的行。对于RULE_ID = 2,将有匹配的行。
如果对上述示例数据运行第一个查询,则结果为:
...而第二个结果为:
您可以选择一些或所有其他列,并且可以使用不同的连接和where条件、分组、排序等来构造sql命令。