【问题标题】:Oracle SQL - How to define a date bind variable based on a select statementOracle SQL - 如何根据选择语句定义日期绑定变量
【发布时间】:2023-04-08 04:11:02
【问题描述】:

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

我想做的是将定义 anfang 更改为 (select c_year_beginning from master_date_automation)。

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

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;

错误信息(Del 注释后编辑):

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:

如果有人可以帮助我,我将非常感激。

提前万分感谢!

【问题讨论】:

  • 好吧,您的错误与您的问题无关。当您在同一脚本中链接块时,请在每个 END; 之后的新行中添加一个 /
  • 另外,我认为您需要再次查看您的脚本。其中许多命令可以/应该在块之外完成,因此您不需要使用EXECUTE IMMEDIATE。此外,请检查您的 BEGINEND 类似括号。您在调用它的块之外声明 V_C_YEAR_YTD。
  • 最重要的是,您不需要在 DDL 语句(DROP、CREATE 等)之后COMMIT,不仅存在由 Oracle 调用的隐式提交,而且它没有适用于这些更改。
  • 非常感谢德尔!我尝试了以下方法,但也没有成功:

标签: sql plsql oracle-sqldeveloper


【解决方案1】:

您不需要在 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';

【讨论】:

    【解决方案2】:

    所以,从上面总结我的 cmets,您不需要 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'
    

    如果需要,请先放下桌子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多