Как объявить, заполнить и использовать переменную с помощью Oracle PL / SQL - PullRequest
1 голос
/ 27 сентября 2019

Я клянусь, что об этом уже много раз спрашивали, но я не могу применить другие примеры к своему случаю использования:

Прежде всего, этот запрос будет выполнен как часть Informatica SQL Source Qualifierи в некоторых случаях передаваться из оператора SQL Server OpenQuery, поэтому следует помнить об этом, и SQL Plus не будет использоваться;Oracle SQL Developer используется только для разработки кода.

Моя история - это, прежде всего, SQL Server и Teradata, но, как следует из названия, у меня теперь есть требование, в котором мне нужно объявить, заполнить и использовать переменную в Oracle,все в пределах одной и той же процедуры. Не SP, поэтому нет объявлений In / Out

В SQL Server этот код будет работать должным образом (для ясности добавлены номера строк):

1.  Declare @MaxDate Int
2.
3.  With f_data (cal_period) As (Select 201904 As cal_period)
4.
5.  Select @MaxDate = Max(cal_period) From f_data
6.
7.  Select
8.  Case
9.      When (@MaxDate%100) < 12 Then @MaxDate+1
10.     Else (@MaxDate+100) - ((@MaxDate%100)-1)
11. End As dt
  • Строка 1: это периоды даты ГГГГММ, определенные как int
  • Строка 3: здесь я использую встроенное представление (CTE) для иллюстрации и чтобы вам было проще копировать и вставлять, но на самом деле,на самом деле это физическая управляющая таблица, поэтому она обычно не будет видна в сценарии.
  • Строка 5: Заполняет параметр (префикс SQL для параметров задается символом at) набором значений с одним значением
  • Строка 7-11: это просто логика для продвижения периода на единицу, процентная отметка в SQL Server - это функция модуля, Oracle записывается как Mod (@ MaxDate, 100)

Для тех, кто не знаком с SQL Server, ему не нужна справочная таблица, такая как Dual ("Sys.Dual") для выполнения запроса, так что для Oracle необходим оператор "From Dual" в отсутствующей строке 12

Мой реквирЭлемент, по сути, является точной копией вышеупомянутого T-SQL, поэтому мне нужно объявить переменную одноразового использования, заполнить эту переменную результатами запроса SQL, а затем использовать эту переменную в преобразовании - результатиз которых записывается в переменную Informatica и SSIS для последующего использования.

До сих пор я пытался объявить переменную, это работало (я имею в виду, что она не возвращала ошибку):

Declare MaxPeriod Int;
Begin
    Select 201904 Into MaxPeriod From Dual;
End;

А заполнение из оператора SQL также показывает, что оно успешно завершено:

Declare MaxPeriod Int;
Begin
    Select Max(MaxPeriodVal) Into MaxPeriod From CtrlTable;
End;

Хотя я не могу выйти за пределы этого, чтобы фактически протестировать переменную при сбое операторов put.line, как и простые проверки Case:

Declare MaxPeriod Int;
Begin
    Select 201904 Into MaxPeriod From Dual;
End;


Select
Case
    When 201904 = MaxPeriod Then 'Match'
    Else 'No Match'
End As dteChk
From Dual;

Я попытался поставить префикс MaxPeriod в проверке с помощью двоеточия, а префикс, суффикс / оба - с амперсандом, например: MaxPeriod;& MaxPeriod;MaxPeriod &;& MaxPeriod & Все из которых не удалось.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Основная проблема - это проблема переменной области видимости.Вы объявляете MaxPeriod в контексте анонимного блока PL / SQL, поэтому он исчезнет (выйдет из области видимости), когда блок завершится в строке 4.

Вы можете поместить весь свой запрос в полеБлок PL / SQL, но нет простого способа вернуть весь набор результатов из блока PL / SQL, поэтому я не думаю, что вы этого хотите.

Я не знаю, как обрабатывает ваш драйвер Oracleнативные запросы, но это может работать:

var MaxPeriod number; -- bind variable declared as global scope for this script

Begin -- one of several ways to assign values to bind variables
    :MaxPeriod := 201904;
End;
/

Select
Case
    When 201904 = :MaxPeriod Then 'Match'
    Else 'No Match'
End As dteChk
From Dual;

Если синтаксис var не работает для вас, чтобы объявить переменную привязки SQL, то вам, возможно, придется искать какой-то другой способ передачи привязкипеременная для строки запроса.Возможно, вы могли бы передать нулевое значение (для типа данных числа, в любом случае) и затем перезаписать его в сценарии SQL.

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

With f_data As (Select 201904 As cal_period from dual)
Select
Case
      When Mod(MaxDate,100) < 12 Then MaxDate+1
     Else (MaxDate+100) - (Mod(MaxDate,100)-1)
End As dt
from (Select Max(cal_period) as MaxDate From f_data) mp
0 голосов
/ 27 сентября 2019

Вы можете использовать переменную substitution, используя define в sql * plus, как указано ниже.

Define MaxPeriod := 201904
Select
Case
    When &MaxPeriod = MaxPeriod Then 'Match'
    Else 'No Match'
End As dteChk
From Dual;

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...