【问题标题】:Using variables within the WHERE clause in Oracle SQL Developer在 Oracle SQL Developer 的 WHERE 子句中使用变量
【发布时间】:2014-12-03 13:03:44
【问题描述】:

我是 Oracle SQL Developer 的新手。我有 VFP 背景,我在尝试使用变量时遇到了困难,因为我已经完成了很多其他应用程序。定义变量,确定变量是什么(以编程方式),然后使用变量。我对前 2 个很好,但我不知道如何使用该变量。创建一个过程,将select语句写入var字符串,输出到游标?我看过很多例子,但没有什么我可以使用的,或者我只是不理解不同的概念。这是我开始使用的代码。

declare
    v_mydate DATE;
begin
  select max(date_added) into v_mydate from TEST_TB;

  DBMS_OUTPUT.put_line(TO_CHAR(v_mydate)); -- checking to see if the variable has been assigned. It has

create table test_banks as
SELECT DISTINCT
    FIELD1,
    FIELD2,
  , DATE_APPEND
FROM TEST_TB
  WHERE DATE_ADDED=V_MYDATE
end; 

Field1 和 Field2 将有许多不同的组合。我希望它们都具有 max(date_added) 值。

【问题讨论】:

  • 您可以在 PL/SQL 块中使用 DDL 语句吗?不,不直接:dba-oracle.com/t_using_ddl_create_index_table_plsql.htm
  • 除非您想将其作为练习,否则您可以获得SELECT DISTINCT field1, field2, date_append FROM TEST_TB(SELECT TRUNC(MAX(date_added)) FROM TEST_TB); 之类的数据

标签: oracle variables plsql


【解决方案1】:

这里不允许使用 DDL。 DDL 是数据定义语言。 CREATE TABLE 是一个 DDL 语句。 尝试立即执行,这确实是低效的。

declare
    v_mydate DATE;
begin
  select max(date_added) into v_mydate from TEST_TB;

  DBMS_OUTPUT.put_line(TO_CHAR(v_mydate)); -- checking to see if the variable has been assigned. It has

EXECUTE IMMEDIATE
'create table test_banks as
SELECT DISTINCT
    FIELD1,
    FIELD2,
  , DATE_APPEND
FROM TEST_TB
  WHERE DATE_ADDED in (select max(date_added) from TEST_TB)';

end; 

【讨论】:

  • 但重点是使用变量。那么答案不会是'...where date_added = date ''' || to_char( v_mydate, 'yyyy-mm-dd' ) || ''';';
【解决方案2】:

你不需要使用PLSQL来做这个任务,你可以像下面这样创建一个视图

CREATE OR REPLACE VIEW VW_TEST_BANKS 
AS SELECT DISTINCT field1, field2, date_append 
FROM TEST_TB where date_added=(SELECT TRUNC(MAX(date_added)) FROM TEST_TB)

或者如果你想在 WHERE 子句中测试变量的使用,你可以试试下面的

    declare
          v_mydate DATE;
    begin
      select max(date_added) into v_mydate from TEST_TB;

      DBMS_OUTPUT.put_line(TO_CHAR(v_mydate)); -- checking to see if the variable has been assigned. It has

      FOR REC in (SELECT DISTINCT FIELD1, FIELD2,, DATE_APPEND
                    FROM TEST_TB
                   WHERE DATE_ADDED = V_MYDATE) LOOP
        DBMS_OUTPUT.put_line('field1 ' || rec.field1);
        DBMS_OUTPUT.put_line('field2 ' || rec.field2);
        DBMS_OUTPUT.put_line('date_append ' || rec.date_append);
      END LOOP;
    end;

【讨论】:

  • 感谢所有输入。我知道如何直接在查询中获取值,我的问题更多是关于如何在定义变量和存储到它们的值后使用它们。似乎为了使用变量生成输出(根据变量提取的数据创建表),代码需要是一个过程,而不仅仅是工作表中的命令行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2014-02-16
  • 2021-11-12
  • 2011-08-04
相关资源
最近更新 更多