将日期变量传递给 sql 动态语句
Passing date variable to sql dynamic statement
我有一个包,我需要多次执行类似的合并。这个包每天都执行,我每天都需要不同的数据(取决于一天)。所以我虽然创建了一个临时视图并在此视图上执行操作。由于似乎无法以静态方式在过程中创建视图,并且无法使用绑定变量,因此我尝试以这种方式进行:
PROCEDURE CREATE_VIEW( from_date DATE) IS
sqlCommand VARCHAR2(32000);
BEGIN
sqlCommand :=
'CREATE VIEW TMP_HELPER_VIEW AS
SELECT ID, IMPORT1_ID, IMPORT2_ID, PROD_ID
FROM
(
SELECT ID,
IMPORT1_ID,
-1,
PROD_ID
FROM TABLE1
WHERE
TS >= '||from_date||'
AND TS < ADD_MONTHS('||from_date||', 1)
UNION
SELECT ID,
-1,
IMPORT2_ID,
PROD_ID
FROM TABLE2
WHERE
TS >= '||from_date||'
AND TS < ADD_MONTHS('||from_date||', 1)';
EXECUTE IMMEDIATE sqlCommand;
END CREATE_VIEW;
不过我要到这里 ORA-00907: missing right parenthesis
。
我认为我以错误的方式连接日期变量。谁能告诉我如何修复它?
非常感谢!
您可以做的是使用 DBMS_OUTPUT.PUT_LINE 转储确切的命令文本。你会看到你会有这样的东西:
WHERE TS >= 08-DEC-20
这是因为日期没有引号,所以是您出错的原因。您实际上希望引用的日期看起来像这样:
WHERE TS >= '08-DEC-20'
所以你的代码需要像
这样的东西
WHERE TS >= '||chr(39)||from_date||chr(39)||'
使用 DATE
文字并命名列:
CREATE PROCEDURE CREATE_VIEW(
from_date DATE
)
IS
BEGIN
EXECUTE IMMEDIATE
'CREATE OR REPLACE VIEW TMP_HELPER_VIEW (ID, IMPORT1_ID, IMPORT2_ID, PROD_ID) AS
SELECT ID, IMPORT1_ID, -1, PROD_ID
FROM TABLE1
WHERE TS >= DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||'''
AND TS < ADD_MONTHS(DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||''', 1)
UNION
SELECT ID, -1, IMPORT2_ID, PROD_ID
FROM TABLE2
WHERE TS >= DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||'''
AND TS < ADD_MONTHS(DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||''', 1)';
END CREATE_VIEW;
/
或者,如果您想在时间中包含一个时间分量,则使用 TIMESTAMP
文字:
CREATE OR REPLACE PROCEDURE CREATE_VIEW(
from_date DATE
)
IS
BEGIN
EXECUTE IMMEDIATE
'CREATE OR REPLACE VIEW TMP_HELPER_VIEW (ID, IMPORT1_ID, IMPORT2_ID, PROD_ID) AS
SELECT ID, IMPORT1_ID, -1, PROD_ID
FROM TABLE1
WHERE TS >= TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||'''
AND TS < ADD_MONTHS(TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||''', 1)
UNION
SELECT ID, -1, IMPORT2_ID, PROD_ID
FROM TABLE2
WHERE TS >= TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||'''
AND TS < ADD_MONTHS(TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||''', 1)';
END CREATE_VIEW;
/
我有一个包,我需要多次执行类似的合并。这个包每天都执行,我每天都需要不同的数据(取决于一天)。所以我虽然创建了一个临时视图并在此视图上执行操作。由于似乎无法以静态方式在过程中创建视图,并且无法使用绑定变量,因此我尝试以这种方式进行:
PROCEDURE CREATE_VIEW( from_date DATE) IS
sqlCommand VARCHAR2(32000);
BEGIN
sqlCommand :=
'CREATE VIEW TMP_HELPER_VIEW AS
SELECT ID, IMPORT1_ID, IMPORT2_ID, PROD_ID
FROM
(
SELECT ID,
IMPORT1_ID,
-1,
PROD_ID
FROM TABLE1
WHERE
TS >= '||from_date||'
AND TS < ADD_MONTHS('||from_date||', 1)
UNION
SELECT ID,
-1,
IMPORT2_ID,
PROD_ID
FROM TABLE2
WHERE
TS >= '||from_date||'
AND TS < ADD_MONTHS('||from_date||', 1)';
EXECUTE IMMEDIATE sqlCommand;
END CREATE_VIEW;
不过我要到这里 ORA-00907: missing right parenthesis
。
我认为我以错误的方式连接日期变量。谁能告诉我如何修复它?
非常感谢!
您可以做的是使用 DBMS_OUTPUT.PUT_LINE 转储确切的命令文本。你会看到你会有这样的东西:
WHERE TS >= 08-DEC-20
这是因为日期没有引号,所以是您出错的原因。您实际上希望引用的日期看起来像这样:
WHERE TS >= '08-DEC-20'
所以你的代码需要像
这样的东西 WHERE TS >= '||chr(39)||from_date||chr(39)||'
使用 DATE
文字并命名列:
CREATE PROCEDURE CREATE_VIEW(
from_date DATE
)
IS
BEGIN
EXECUTE IMMEDIATE
'CREATE OR REPLACE VIEW TMP_HELPER_VIEW (ID, IMPORT1_ID, IMPORT2_ID, PROD_ID) AS
SELECT ID, IMPORT1_ID, -1, PROD_ID
FROM TABLE1
WHERE TS >= DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||'''
AND TS < ADD_MONTHS(DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||''', 1)
UNION
SELECT ID, -1, IMPORT2_ID, PROD_ID
FROM TABLE2
WHERE TS >= DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||'''
AND TS < ADD_MONTHS(DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||''', 1)';
END CREATE_VIEW;
/
或者,如果您想在时间中包含一个时间分量,则使用 TIMESTAMP
文字:
CREATE OR REPLACE PROCEDURE CREATE_VIEW(
from_date DATE
)
IS
BEGIN
EXECUTE IMMEDIATE
'CREATE OR REPLACE VIEW TMP_HELPER_VIEW (ID, IMPORT1_ID, IMPORT2_ID, PROD_ID) AS
SELECT ID, IMPORT1_ID, -1, PROD_ID
FROM TABLE1
WHERE TS >= TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||'''
AND TS < ADD_MONTHS(TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||''', 1)
UNION
SELECT ID, -1, IMPORT2_ID, PROD_ID
FROM TABLE2
WHERE TS >= TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||'''
AND TS < ADD_MONTHS(TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||''', 1)';
END CREATE_VIEW;
/