Объявить переменные и использовать их в запросе oracle - PullRequest
0 голосов
/ 20 июня 2020

Я нахожусь в процессе миграции данных, конвертирую запрос Sybase в oracle 11g Я застрял на этой штуке за последние 2 дня

@Declare @myDate Datetime
Select @myDate = workingDate from MyTable

Тогда есть несколько операторов sql в который переменная myDate используется в предложении where

For Ex

Select * form table1 
join table1 on table1.id = table.id
join table1 on table1.id =  mytable.id
where mytable.workingDate = my_date

// поэтому, наконец, я хочу объявить одну переменную, которая получит свое значение из предложения select и использовать его в дальнейших sql операторах в сложном запросе

Я хочу добиться того же в Oracle 11g без дополнительной сложности

Я новичок в oracle, ваша помощь обязательно.

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

variable не поддерживает даты и временные метки. Также ваш окончательный запрос должен использовать :my_date (с указанием переменной хоста), а не my_date.

Если целью является заполнение таблиц с использованием переменных, заполненных на предыдущем шаге, вы можете использовать PL / SQL для всей задачи, например,

declare
    myDate date;
begin
    select some_col into myDate from wherever;

    insert into target_table (col1, col2, col2)
    select x, y, z
    from   source_table
    where  business_date = myDate;
end;

Или, что еще лучше, определите PL / SQL packages , чтобы инкапсулировать ваш лог обработки c.

Что касается кода вы разместили, начиная с Oracle 12.1, вы можете объявить курсор ref в PL / SQL и попросить клиентов, таких как SQL* Plus, просто вызвать блок и распечатать результаты:

declare
    my_date timestamp;
    results sys_refcursor;
begin
    select systimestamp into my_date
    from   dual;

    open results for
        select my_date as my_date from dual;
    
    dbms_sql.return_result(results);
end;
/
PL/SQL procedure successfully completed.

ResultSet #1

MY_DATE
---------------------------------------------------------------------------
20-JUN-20 10.02.29.130000000

1 row selected.

Для более ранних версий Oracle вам все равно нужно объявить курсор ref как переменную хоста в SQL* Plus:

set autoprint on

var results refcursor

declare
    my_date timestamp;
begin
    select systimestamp into my_date
    from   dual;

    open :results for
        select my_date as my_date from dual;
end;
/

(или set autoprint off, а затем print results явно.)

Я не знаю Java, поэтому я не знаю, будет ли какой-либо из вышеперечисленных подходов работать в вашей среде.

0 голосов
/ 20 июня 2020

Используете ли вы SQLPlus: я не думаю, что вы можете объявить переменную SQLPlus TIMESTAMP.

Попробуйте вместо этого переменную VARCHAR2 и преобразовать в TIMESTAMP:

SQL> select banner from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL> variable ko timestamp;
Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
            VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
            NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE
            REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ]
SQL> --
SQL> variable my_date varchar2(50) ;
SQL> begin
  2  select workingDate  into :my_date from MyTable;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> print my_date;

MY_DATE
------------------------------
20-JUN-20 10.55.55.264286 AM

SQL> print :my_date;

MY_DATE
------------------------------
20-JUN-20 10.55.55.264286 AM

SQL> --
SQL> select * from mytable;

WORKINGDATE
------------------------------
20-JUN-20 10.55.55.264286 AM

SQL> select workingDate  from MyTable where workingDate = to_timestamp(:my_date, 'DD-MON-YY HH.MI.SSXFF AM');

WORKINGDATE
------------------------------
20-JUN-20 10.55.55.264286 AM

SQL> 
...