Как сделать чтобы в Oracle запрос был с связанными переменны

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Как сделать чтобы в Oracle запрос был с связанными переменны

Сообщение tanatol »

Как сделать через PROP:SQL чтобы в Oracle запрос был со связанными переменными.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Как сделать чтобы в Oracle запрос был с связанными перем

Сообщение Andrew™ »

tanatol писал(а):Как сделать через PROP:SQL чтобы в Oracle запрос был со связанными переменными.
вопрос не очень понятен, может требуется следующее:

Код: Выделить всё

I  LONG

  CODE
  I = 20
  FILE{PROP:SQL} = 'SELECT Field1,Field2 from myTable where Field3=' & I
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

В Oracle тогда будет курсор вида:'SELECT Field1,Field2 from myTable where Field3=20 , а надо :SELECT Field1,Field2 from myTable where Field3=:b1 . Чтобы можно было использовать этот курсор для всех значений в цикле!
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Сообщение lsgsoftware »

По-видимому, это проблема не только оракла. Использование кларион-переменных в SQL-запросах вопрос вообще мутный. В доке пшик - т.е. написано очень мало. Может быть Андрей Мялин выложит на форум несколько фрагментов заведомо работающего кода с краткими комментариями. Я использую для этих целей ламерский приемчик - создаю служебную таблицу, в которой описываю нужные переменнные, данные в нее заталкиваю с помощью клариона (set, next ...), а затем считываю эти данные внутри SQL-запроса. Так же и в обратную сторну для передачи результатов в кларион-переменные. Грубо конечно, но зато работает.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):В Oracle тогда будет курсор вида:'SELECT Field1,Field2 from myTable where Field3=20 , а надо :SELECT Field1,Field2 from myTable where Field3=:b1 . Чтобы можно было использовать этот курсор для всех значений в цикле!
Это как в цикле?

Это уже не один запрос, а несколько, т к на момент открытия КУРСОРА будет взято определённое значение :B1, получается что в твоём случае опять работает следующая конструкция

Код: Выделить всё

LOOP I# = 1 TO 100
 FILE{PROP:SQL} = 'SELEC Field1,Field2 from myTABLE where Field3=' & I#
 NEXT(FILE)
END

всё зависит от задачи и LOOP можно превратить в BETWEEN или IN конструкцию, тады будет один курсор

Код: Выделить всё

FILE{PROP:SQL} =  FILE{PROP:SQL} = 'SELEC Field1,Field2 from myTABLE where Field3 BETWEEN ' & i# & ' AND ' & J#
или

Код: Выделить всё

FILE{PROP:SQL} =  FILE{PROP:SQL} = 'SELEC Field1,Field2 from myTABLE where Field3 IN( ' & i# & ',' & J# & ')'
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

lsgsoftware писал(а):По-видимому, это проблема не только оракла. Использование кларион-переменных в SQL-запросах вопрос вообще мутный. В доке пшик - т.е. написано очень мало. Может быть Андрей Мялин выложит на форум несколько фрагментов заведомо работающего кода с краткими комментариями. Я использую для этих целей ламерский приемчик - создаю служебную таблицу, в которой описываю нужные переменнные, данные в нее заталкиваю с помощью клариона (set, next ...), а затем считываю эти данные внутри SQL-запроса. Так же и в обратную сторну для передачи результатов в кларион-переменные. Грубо конечно, но зато работает.
это на тему биндования переменных, да, в FILE,DRIVER сложновато их юзать через PROP:SQL, вот как это выглядит у меня:

Код: Выделить всё

sql  MAVSelect
I    LONG
  CODE
  sql.Init(1,1) ! хотим одну запись прочитать
  sql.BindFields(myTable) ! читаем все поля записи файла из DCT
  LOOP I = 1 TO 100
    sql.Where(myTable.Field3,I)
    IF NOT sql.Run() AND NOT sql.Fetch()
      ! прочитали успешно
    ELSE
      MAVSHOWERROR
    END
   sql.Reset()
  END
запросы к бд будут следующего вида:

Код: Выделить всё

 select Field1,Field2,Field3 from myTable where Field3=?
опять же повторюсь, такой код с точки зрения разработки неэффектифный, необходимо по максимому уменьшить количество запросов к БД и вытаскивать данные за один запрос, т е как и писал, либо юзать BETWEEN или IN конструкции

Код: Выделить всё

 sql.BindParameter(myTable.Field3,1)
 sql.BindParameter(myTable.Field3,10)
 sql.Where(sql.field(myTable.Field3) & ' in(?,?)')
а если этих ? значений очень много, создавать временную таблицу, заливать в неё эти значения и делать запрос типа

Код: Выделить всё

  select ... from myTable where Field3 in (select Field3 from #TempTable)
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):В Oracle тогда будет курсор вида:'SELECT Field1,Field2 from myTable where Field3=20 , а надо :SELECT Field1,Field2 from myTable where Field3=:b1 . Чтобы можно было использовать этот курсор для всех значений в цикле!
ВСПОМНИЛ КАК ТАКОЙ ЗАПРОС ВОСПРОИЗВЕСТИ В CLARION

Код: Выделить всё

I  LONG
sql VIEW(myTable)
  PROJECT(FILE:Field1)
  PROJECT(FILE:Field2)
  END
  CODE
  PUSHBIND
  BIND('I',I)
  BIND(FILE:RECORD)
  LOOP I = 1 TO 100
   sql{PROP:Filter} ='FILE:FIELD3=I'
   open(sql)
   IF NOT ERRORCODE()
    LOOP
     NEXT(sql)
     IF ERRORCODE() THEN BREAK.
    END
    CLOSE(sql)
   END
  END
  POPBIND   
вот при таком расскладе запросы будут именно такого типа:

Код: Выделить всё

SELECT Field1,Field2 from myTable where Field3=:b1
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

Цикл у меня не такой простой : идет по кларионовскому файлу. И запрос к Ораклу не к одной таблице, а более сложный с использованием нескольких таблиц, а таблица из словаря - это просто подложка для результата. Где в последнем примере задать запрос ( PROP:SQL ) ? А то чтобы не плодить кучу курсоров , приходится использовать процедуру, реализующую этот сложный запрос.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):Цикл у меня не такой простой : идет по кларионовскому файлу. И запрос к Ораклу не к одной таблице, а более сложный с использованием нескольких таблиц, а таблица из словаря - это просто подложка для результата. Где в последнем примере задать запрос ( PROP:SQL ) ? А то чтобы не плодить кучу курсоров , приходится использовать процедуру, реализующую этот сложный запрос.
в последнем примере не надо юзать PROP:SQL, а надо юзать PROP:Filter, DRIVER сам его преобразует в SQL запрос
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

PROP:Filter это я так понимаю для WHERE , а где указывать сами таблицы и JOIN-ы . Типа myTable{PROP:SQL}='select a.f1, b.f1 from a, b where a.f1=b1.f1 and a.f2='&number.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):PROP:Filter это я так понимаю для WHERE , а где указывать сами таблицы и JOIN-ы . Типа myTable{PROP:SQL}='select a.f1, b.f1 from a, b where a.f1=b1.f1 and a.f2='&number.
всё внутри Clarion View через PROJECT и JOIN конструкции
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

Спасибо за ответы. Придется в кларионовском словаре прописывать таблицы A и B, затем их join-ть в View. Одной таблицой-подложкой для различных запросов с разными таблицами не обойтись, чтобы можно в Оракле иметь куросры со связанными переменными.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):Спасибо за ответы. Придется в кларионовском словаре прописывать таблицы A и B, затем их join-ть в View. Одной таблицой-подложкой для различных запросов с разными таблицами не обойтись, чтобы можно в Оракле иметь куросры со связанными переменными.
можно и не прописывать таблицы A и B в DCT, а создать на сервере требуемую SQL View - по сути это скомпилированный SQL запрос, в DCT только её и продекларировать и по ней и работать
Ответить