【问题标题】:delete query using execute Immediate使用立即执行删除查询
【发布时间】:2017-11-24 08:50:09
【问题描述】:
我想将 varchar2 转换为日期,但它发生的错误给我解决方案
DECLARE
ADATE VARCHAR2(100):='02/20/1981';
BEGIN
EXECUTE IMMEDIATE 'DELETE FROM emp WHERE HIREDATE= '||to_char(to_date(ADATE,'mm/dd/yy'),'mm/dd/yy');
DBMS_OUTPUT.PUT_LINE('DELETE');
END;
【问题讨论】:
标签:
sql
oracle
plsql
oracle11g
oracle-apex-5
【解决方案1】:
你也可以用这个:
DECLARE
ADATE VARCHAR2 (100) := '02/20/1981';
BEGIN
EXECUTE IMMEDIATE
'DELETE FROM emp WHERE HIREDATE= :aDate' using TO_DATE(ADATE, 'mm/dd/yyyy');
DBMS_OUTPUT.PUT_LINE ('DELETE');
COMMIT;
END;
【解决方案2】:
你可以使用它。确保使用USING 子句传递绑定变量以避免SQL 注入。也正如@Kaushik 所提到的,没有必要做TO_CHAR。
DECLARE
ADATE VARCHAR2 (100) := '02/20/1981';
BEGIN
EXECUTE IMMEDIATE
'DELETE FROM emp WHERE HIREDATE= TO_DATE(:ADATE, ''mm/dd/yyyy'')' using adate;
DBMS_OUTPUT.PUT_LINE ('DELETE');
COMMIT;
END;
【解决方案3】:
您无需将其转换为TO_CHAR。引号必须正确并使用正确的日期格式。
DECLARE
ADATE VARCHAR2(100):='02/20/1981';
BEGIN
EXECUTE IMMEDIATE 'DELETE FROM emp WHERE HIREDATE=to_date('''||ADATE||''',''mm/dd/yyyy'')';
DBMS_OUTPUT.PUT_LINE('DELETE');
END;
对于您的删除操作,您甚至不需要EXECUTE IMMEDIATE。像这样的块应该足够了。
DECLARE
ADATE VARCHAR2(100):='02/20/1981';
BEGIN
DELETE FROM emp WHERE HIREDATE=to_date(ADATE,'mm/dd/yyyy');
DBMS_OUTPUT.PUT_LINE('DELETE');
END;