sql - 如何在 EXECUTE IMMEDIATE 中使用动态 where 子句
问题描述
我有一个表,其中包含 insert、select、where 子句、动态 where 子句、group by 子句。
使用过程我需要执行 insert into 语句并使用动态 where 子句。
我尝试了以下一个,但是它给了我一个错误的缺失表达式。
create or replace PROCEDURE dynamicWhereClause(Datee IN DATE,processId IN NUMBER)
IS
processName VARCHAR2(100);
tablePrefix CONFIG_DETAILS.SOURCE_TABLE%Type;
sourceTableType CONFIG_DETAILS.SOURCE_TABLE_TYPE%Type;
insertClause CONFIG_DETAILS.INSERT_CLAUSE%Type;
selectClause CONFIG_DETAILS.SELECT_CLAUSE%Type;
whereClause CONFIG_DETAILS.WHERE_CLAUSE%Type;
onUpdateClause CONFIG_DETAILS.ON_UPDATE_CLAUSE%Type;
groupByClause CONFIG_DETAILS.GROUP_BY_CLAUSE%Type;
orderByClause CONFIG_DETAILS.ORDER_BY_CLAUSE%Type;
isDynamicWhereClause CONFIG_DETAILS.IS_DYNAMIC_WHERE_CLAUSE%Type;
tableName VARCHAR2(50);
Process_Date DATE;
processQuery VARCHAR2(6000 BYTE);
CURSOR Process_Report IS
select NAME,SOURCE_TABLE,SOURCE_TABLE_TYPE,INSERT_CLAUSE,SELECT_CLAUSE,WHERE_CLAUSE,ON_UPDATE_CLAUSE,GROUP_BY_CLAUSE,ORDER_BY_CLAUSE,IS_DYNAMIC_WHERE_CLAUSE FROM
CONFIG_DETAILS where ID=processId;
BEGIN
OPEN Process_Report;
LOOP
FETCH Process_Report INTO processName,tablePrefix,sourceTableType,insertClause,selectClause,whereClause,onUpdateClause,groupByClause,orderByClause,isDynamicWhereClause;
EXIT when Process_Report%NOTFOUND;
tableName := getSourceTableName(tablePrefix,sourceTableType,processDate);
Process_Date := processDate;
processQuery := insertClause || selectClause ||' from ' || tableName ||' ' ||
nvl(whereClause,'') ||''||nvl(groupByClause,'') ||''||nvl(orderByClause,'') ||''||nvl(onUpdateClause,'');
dbms_output.put_line(processQuery);
IF isDynamicWhereClause = 'Y'
THEN
dbms_output.put_line(processQuery);
EXECUTE IMMEDIATE processQuery USING Process_Date;
ELSE
EXECUTE IMMEDIATE processQuery;
END IF;
END LOOP;
CLOSE Process_Report;
END;
在执行过程时,它给了我以下错误。
Error report -
ORA-00936: missing expression
ORA-06512: at "Mytest.dynamicWhereClause", line 44
ORA-06512: at line 1
00936. 00000 - "missing expression"
请进一步协助我
谢谢
解决方案
您的问题不是 100% 清楚。你说 afterDATEE
是空的,你是在 date 之后分配一个变量吗?下面是如何将执行立即数与变量一起使用的示例。请注意绑定变量:i
在打印中的显示方式。
set serveroutput on size 1000
/
declare t number(4) :=10;
txt varchar2(100);
begin
txt :='INSERT INTO TAB (ID) values (:i)';
dbms_output.put_line(t || ' ' || txt);
execute immediate txt using T;
end;
/
PL/SQL procedure successfully completed
10 INSERT INTO TAB (ID) values (:i)
推荐阅读
- python - 防止将缩进从制表符更改为空格
- c# - 将 Ocelot 16.0 与 ASP.Net Core 3.1 集成不起作用,因为我需要将 Swagger 与 Ocelot 一起使用
- java - 每个 TreeItem 的 JavaFX TreeView ContextMenu
- python - 如果文件太小,为什么 python-magic 返回错误的 mime-type?
- angular - 这种在 Jasmine 中使用 Angular 模拟服务中的服务的方式是否正确?
- ionic-framework - Ionic 5 Google Recaptcha 不显示 - ng-recaptcha
- python - pandas:将列中的字符串扩展为子字符串并将它们添加到行中
- javascript - .datatable 不是 jquery 中的函数
- javascript - 在没有 javascript 的情况下在悬停时显示/隐藏 div 子项
- sql - 带有 IF 条件的 MyBatis SELECT 查询