Oracle SQL - 如何根据 select 语句定义日期绑定变量

Oracle SQL - How to define a date bind variable based on a select statement

使用 Oracle SQL,我有几个 SQL 带有手动绑定变量的查询,用于创建 table,如下所示:

我想做的是将 define anfang 更改为 (select c_year_beginning from master_date_automation).

我已经尝试了几种绑定变量的组合,但无法使其工作(使用 DEL 注释编辑):

begin
execute immediate 'DROP TABLE A_TEST_TABLE'
end;
/
begin
execute immediate 'create table A_TEST_TABLE (
  user varchar2(100),
  product    varchar2(100),
  datum date)';
end;
/
BEGIN
DECLARE
v_c_year_ytd DATE;

BEGIN
SELECT c_year_ytd Into v_c_year_ytd FROM master_date_automation;

BEGIN
SELECT usr.datum || ','
       || usr.user || ','
       || usr.product
INTO A_TEST_TABLE
FROM   users_table usr
WHERE  usr.datum = v_c_year_ytd
       AND kto.kontonummer = '00510199065';
END;
END;
END;

错误消息(删除评论后编辑):

Error report -
ORA-06550: line 12, column 6:
PLS-00403: expression 'A_TEST_TABLE' cannot be used as an INTO-target of a SELECT/FETCH statement
ORA-06550: line 12, column 21:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 9, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

如果有人能帮助我,我将不胜感激。

万分感谢!

因此,总结我上面的评论,您不需要 PL/SQL 来执行此操作。您可以直接使用 SQL:

完成所有脚本
CREATE TABLE A_TEST_TABLE
(
  user varchar2(100),
  product    varchar2(100),
  datum      date
);

INSERT INTO a_test_table
SELECT usr.user,
       usr.product,
       usr.datum
FROM users_table
WHERE usr.datum = (SELECT c_year_ytd FROM master_date_automation)
AND usr.user= '123456789'

如果需要先删除 table。

您不需要在 PL/SQL 块中使用动态 SQL 来创建表;你可以使用 SQL 语句来做到这一点:

DROP TABLE A_TEST_TABLE;

CREATE TABLE A_TEST_TABLE (
  user_name    varchar2(100),
  product varchar2(100),
  datum   date
);

注意:USER 是一个保留字,您不能将它用作不带引号的标识符;您将需要找到另一个标识符,例如 user_name ,或者您将不得不使用带引号的标识符,并在任何使用它的地方都将其称为 "USER" (但是,这是不好的做法)。

那么如果你想使用PL/SQL你可以使用:

DECLARE
  v_c_year_ytd DATE;
BEGIN
  SELECT c_year_ytd
  Into   v_c_year_ytd
  FROM   master_date_automation;

  INSERT INTO a_test_table (datum, user_name, product)
  SELECT datum,
         user_name
         product
  FROM   users_table
  WHERE  datum = v_c_year_ytd
  AND    kontonummer = '00510199065';
END;
/

但是只使用一个 SQL 语句会简单得多:

INSERT INTO a_test_table (datum, user_name, product)
SELECT datum,
       user_name
       product
FROM   users_table
WHERE  datum = (SELECT c_year_ytd FROM master_date_automation)
AND    kontonummer = '00510199065';