我是Oracle PL / SQL的新手,虽然我有很多SQL经验。 目前我正在尝试将几个T-SQL语句转换为PL / SQL。我正在尝试执行以下代码,但是我遇到了一些错误。
如果该表尚不存在,则错误为:表或视图不存在。 但是当我在没有第二个select语句的情况下运行查询时,它会创建表。现在该表存在,我试图再次执行它,现在我收到以下错误:
这个SELECT语句中应该有一个INTO子句。
我正在使用的代码:
DECLARE
cnt NUMBER;
stmt VARCHAR2(1000) := 'CREATE TABLE LAST_LOG_ARCHIVE (LAST_LOG_ARCHIVE TIMESTAMP NULL)';
BEGIN
SELECT COUNT(*) INTO cnt FROM all_tables WHERE table_name = 'LAST_LOG_ARCHIVE';
IF (cnt = 0) THEN
EXECUTE IMMEDIATE stmt;
END IF;
SELECT COALESCE((
SELECT LAST_LOG_ARCHIVE FROM LAST_LOG_ARCHIVE WHERE ROWNUM = 1
), TO_TIMESTAMP('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) AS LAST_LOG_ARCHIVE FROM dual;
END;
我该如何解决这个问题??
答案 0 :(得分:0)
您的第二个查询需要INTO语句
SELECT COALESCE((
SELECT LAST_LOG_ARCHIVE FROM LAST_LOG_ARCHIVE WHERE ROWNUM = 1
), TO_TIMESTAMP('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) AS LAST_LOG_ARCHIVE
INTO l_someVariable
FROM dual;
请记得在l_someVariable
部分
DECLARE
答案 1 :(得分:0)
变化:
DECLARE
cnt NUMBER;
stmt VARCHAR2(1000) := 'CREATE TABLE LAST_LOG_ARCHIVE (LAST_LOG_ARCHIVE TIMESTAMP NULL)';
BEGIN
SELECT COUNT(*) INTO cnt FROM all_tables WHERE table_name = 'LAST_LOG_ARCHIVE';
IF (cnt = 0) THEN
EXECUTE IMMEDIATE stmt;
END IF;
SELECT COALESCE((
SELECT LAST_LOG_ARCHIVE FROM LAST_LOG_ARCHIVE WHERE ROWNUM = 1
), TO_TIMESTAMP('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) AS LAST_LOG_ARCHIVE FROM dual;
END;
要:
DECLARE
V_LAST_LOG_ARCHIVE varchar2(100);
cnt NUMBER;
stmt VARCHAR2(1000) := 'CREATE TABLE LAST_LOG_ARCHIVE (LAST_LOG_ARCHIVE TIMESTAMP NULL)';
BEGIN
SELECT COUNT(*) INTO cnt FROM all_tables WHERE table_name = 'LAST_LOG_ARCHIVE';
IF (cnt = 0) THEN
EXECUTE IMMEDIATE stmt;
END IF;
SELECT COALESCE((
SELECT LAST_LOG_ARCHIVE
FROM LAST_LOG_ARCHIVE
WHERE ROWNUM = 1), TO_TIMESTAMP('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
INTO V_LAST_LOG_ARCHIVE
FROM dual;
END;
答案 2 :(得分:0)
SELECT COALESCE(( SELECT LAST_LOG_ARCHIVE来自LAST_LOG_ARCHIVE WHERE ROWNUM = 1 ),TO_TIMESTAMP(' 2015-01-01 00:00:00',' YYYY-MM-DD HH24:MI:SS'))AS LAST_LOG_ARCHIVE来自dual;
PL / SQL 与 SQL 不同。您必须使用 INTO 子句,因为没有INTO子句的SELECT语句在PL / SQL中会失败。基本上,选择一行并对其不采取任何行动是没有意义的。
如果您只想进行选择,则在纯SQL中执行,而不是在PL / SQL中执行。如果要将select中返回的行中的相应值存储到局部变量中,请使用 INTO 子句。
SELECT col1, col2 INTO var1, var2 FROM table
使用选择列表中列的相应数据类型声明变量var1
和var2
。
从文档中了解有关SELECT INTO Statement的更多信息。
此外,
TO_TIMESTAMP(' 2015-01-01 00:00:00',' YYYY-MM-DD HH24:MI:SS')
您只需使用 TO_DATE 代替 TO_TIMESTAMP 。日期包含日期和时间元素。
TO_DATE('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')