Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как получить данные через DBLINK

Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

Как получить данные через DBLINK ?

На одном сервере имеется процедура в пакете, которая возвращает курсор:
...
CREATE OR REPLACE package body package1 is
procedure test_proc(p_inn varchar2,
                            p_cursor out sys_refcursor) is 
...

Если ее вызвать через dblink на другом сервере, то выдается ошибка:
DECLARE
    p_inn varchar2(50) := '771603983483';
BEGIN
    package1.test_proc@dblink(p_inn,:p_cursor);
END;
ORA-24338: указатель оператора не выполнен

поискал аналогичное в поиске

Tom Kyte
refcursors may not be returned over a dblink

Решил попробовать создать табличную функцию и вытащить ее тоже через dblink
(в надежде, что в табличную функцию впихну результаты курсора)
CREATE OR REPLACE package EGRIP_IMPORT.p_test is
    type test_rowGet is record (fnum numeric, fvar varchar2(100 char), fdate date);
    type test_table is table of test_rowGet;
    function get_test_table RETURN test_table pipelined;
end;
CREATE OR REPLACE PACKAGE BODY EGRIP_IMPORT.p_test
AS
    function get_test_table RETURN test_table pipelined
    is
    begin
        for curr in
        (
            ---- fnum numeric, fvar varchar2(100 char), fdate date
            select 12 as fnum, 'qwerqwerqwer' as fvar, to_date('12.01.2017','dd.mm.yyyy') as fdate from dual
            union all
            select 4 as fnum, 'zxcvzxvzxv' as fvar, to_date('05.01.2014','dd.mm.yyyy') as fdate from dual
        )
            loop pipe row(curr);
        end loop;
    end;
end;

Если ее вызвать через dblink
SELECT * FROM TABLE(P_TEST.get_test_table@dblink);
ORA-06553: PLS-752: Табличная функция GET_TEST_TABLE находится в противоречивом состоянии.

Как вытащить данные ?
Ответ:
Владимир СА
AlexFF__|
пропущено...

CREATE OR REPLACE TYPE ... OID '90A1350CAC40434EE044001CC4B76823' IS TABLE of ...
Я вообще то спросил про идеологию... Мне нужен результат курсор..
Один пользователь вызвал с одним параметром, другой с другим...
Как это будет согласовываться с :
автор
CREATE OR REPLACE TYPE ... OID '90A1350CAC40434EE044001CC4B76823' IS TABLE of ...
?
Это создается 1 раз, я правильно понимаю ?
Как в нее будут записываться данные при разных вызовах ? Перекрывание ?

Действительно, чего я лезу ...
Сколько раз уже себе говорил, что умные сами разберутся, а остальные =(
Вопрос: MS SQL Server 2008 - Внешные данные excel через MS Data Query

Всем привет!

Работаю в финансовом департаменте и имеется опыт работы с SQL запросами.

Была поставлена задача выгрузки данных из БД в MS excel 2007 в виде отчетов. Задача была выполнена с помощью вкладки Дата -> Внешние данные -> MS Query. В настройках подключения указал обновлять данные при открытия эксель файла и сохранить пароль. Отчет работает нормально и обновляются данные , но только локально на моем компьютере. Когда скидываю этот отчет коллегам и при обновления файла система выдает ошибку и ругается на ODBC driver:

(Microsoft)(ODBC driver Manager) Data source name not found and no default driver specified



Проверил у коллеги odbcad32.exe - у него были драйвера SQL server Native client, MS ODBC for Oracle, и куча стандартных. Пришлось установить еще Oracle ODBC driver отдельно без клиента.

У меня драйвера SQL server Native client 10.0, Oracle ODBC driver, MS ODBC for Oracle и тд.

Но все равно выдает ту же ошибку. В чем проблема не пойму.

Так же для информации:

Мой Connection String запрса:

DRIVER=SQL Server Native Client 10.0;SERVER=server;UID=user;PWD=password;APP=2007 Microsoft Office system;WSID=My Computer;


Может это быть из-за разных версии драйверов SQL server Native client?

Может быть кто-нибудь сталкивался с данной проблемой

Заранее спасибо
Ответ: Вы до сих пор не создали нужный DSN и не вписали его в свойства соединения?
Ваша ошибка элементарно воспроизводится: меняем на 1 символ имя DSN, на котором построен запрос и вываливается то самое при попытке рефреша.
Что вам неясно?
Вы нашли в меню свойства соединения как у меня на картинке?
Вопрос: Как получить данные, сколько было прочитано, вставлено и т.д.

Всем привет.

FB 2.5.4, классик, win32

Как получить данные, которые IBE показывает на вкладке "Анализ производительности" ?

Я пробовал включать SQL-монитор со всеми галками, ничего полезного в полученой портянке не нашел.

+ пример того, что нужно
Query
------------------------------------------------
select count(*)
from SOME_TABLE t1
join SOME_TABLE t2 on t2.ID>t1.ID;


Plan
------------------------------------------------
PLAN JOIN (T1 NATURAL, T2 INDEX (RDB$PRIMARY414))

Adapted Plan
------------------------------------------------
PLAN JOIN (T1 NATURAL, T2 INDEX (INTEG_4445))

Query Time
------------------------------------------------
Prepare : 16.00 ms
Execute : 0.00 ms
Avg fetch time: 0.00 ms

Memory
------------------------------------------------
Current: 35 435 744
Max : 68 661 424
Buffers: 2 048

Operations
------------------------------------------------
Read : 0
Writes : 0
Fetches: 119
Marks : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges |
| | Total | reads | reads | | | | | | |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|SOME_TABLE | 0 | 36 | 9 | 0 | 0 | 0 | 0 | 0 | 0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+


Суть проблемы в том, что есть потребность выявить и "вылечить" тормозяшие запросы.
Сейчас я в приложении просто фиксирую факт длительного времени выполнения, записывая в лог текст запроса, значения параметров и другую служебную информацию. Но не всегда возможно воспроизвести такую же ситуацию, как в реальном рабочем моменте, поэтому было бы полезно сохранять в лог дополнительную информацию.

Я подозреваю, что это же или почти это же можно получить, включив trace, был бы благодарен за дружесткий пинок в сторону какого-нибудь примера конфига трейса :)

В то же время, на сколько я понимаю, включенный трейс будет мешать работе пользователей ... и я немного сомневаюсь, что можно настроить трейс так, чтобы он фиксировал только првышения длительности запроса, при чем для каждого запроса критерий длинности свой.
Ответ: Таблоид,

даже если SQL сможет решать некоторые задачи с той же скоростью что и PSQL, то вовсе не обязательно писать их именно на SQL. Хотя бы потому что понять потом (спустя хотя бы год) что там понаписано может быть очень затруднительно. Для решения любой задачи надо исходить из двух вещей:
Вопрос: Как получить данные по повторяющимся значениям?

Добрый день!
Скажите, как получить данные по повторяющимся значениям. Например:

SELECT sh1.subs_id, sh1.clnt_id
FROM
SUBS_HISTORY sh1,
PHONE ph
WHERE
ph.MSISDN IN ('1111111', '2222222','1111111')
AND sh1.PHONE_ID = ph.PHONE_ID;

Мне нужно получить 3 значения, 2 из них должны повторяться. В итоге получаю только 2 различных значения.

Ребята, есть идеи?
Ответ:
Janky
oragraf,

я новичок, напиши пример, плз
Зарегистрирован:	17 октября 2007, 14:05
Восемь лет не хватило чтоб освоить элементарные вещи?
Вопрос: Не удается получить данные из связанного сервера

У одного из пользователей не получается получить данные из связанного сервера. Выдает ошибку "Не удалось создать экземпляр поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_phone".".
Под моей учеткой все работает отлично, данные считываются. В чем может быть причина?
Ответ: Androgen1985,

Вопрос: Получить данные в виде иерархии

Доброго времени суток, форумчане, подскажите пожалуйста, как при помощи SQL запроса получить данные в виде такой иерархии:
{
guid: 0000-0000-0000,
title: "Заголовок",
groups:[
{id: 1,title: "Группа1", items: [
{id:10,title:"Элемент"},
{id:11,title:"Элемент"},
{id:12,title:"Элемент"},
{id:13,title:"Элемент"}
]},
{id: 2,title: "Группа2, items: [
{id:14,title:"Элемент"},
{id:15,title:"Элемент"},
{id:16,title:"Элемент"},
{id:17,title:"Элемент"}
]},
{id: 3,title: "Группа3", items: [
{id:18,title:"Элемент"},
{id:19,title:"Элемент"},
{id:20,title:"Элемент"},
{id:21,title:"Элемент"}
]}
]
}
Ответ:
waszkiewicz
Это с какого перепугу? Рекурсию никто пока не отменял

Речь не о методе, а о возвращаемом формате. Тут коллеги правы - только XML или JSON если >=2016.
Вопрос: Импорт данных в Excel из ODBC драйвера

Всем доброго времени суток.
Описание проблемы. Есть ODBC драйвер для подключения к некой БД. Так вот с помощью этого ODBC драйвера данные импортируются в MS Access без проблем. Но вот в MS Excell данные импортировать не получается. Если смотреть последовательность вызовов функций драйвера, то MS Access вызывает последовательно функции ODBC-драйвера SQLAllocEnv, SQLAllocConnect, SQLDriverConnect, SQLAllocStmt, SQLExecDirect, и для каждой полученной записи SQLFetch, SQLGetData… Т.е.MS Access после подключения и выполнения SQL запроса ODBC-драйвером последовательно запрашивает полученные данные. Но при импортировании данных в MS Excel я вижу, что вызываются SQLAllocEnv, SQLAllocConnect, SQLDriverConnect, SQLAllocStmt, SQLExecDirect и затем SQLNumResultCols. Вызовов функций для получения данных (SQLFetch, SQLGetData…) не происходит, а вызываются функции освобождения SQLFreeStmt, SQLDisconnect, SQLFreeConnect и как следствие данные не импортируются.
Кто-нибудь может подсказать, что не так и куда копать?
Заранее благодарен.
Ответ: Из Excel конвертация в csv и т.д. работает. Речь идет о том чтобы не из Excel данные передать (экспортировать), а наоборот необходимо в Excel импортировать данные с помощью ODBC драйвера некоторой базы данных. При использовании приложением ODBC драйвера для импорта данных, есть некоторая стандартная последовательность действий. Так вот почему-то Excel не вызывает некоторые из них. Может кто сталкивался с такой ситуацией. Этот вопрос больше к разработчикам ODBC драйверов.
Вопрос: Как импортировать данные из excel с первого листа неважно как он назван?

Надо получить данные первого листа файла эксел. Причем неважно как лист называется.
Пока делаю так
SQL
1
2
SELECT *
FROM ['наименование листа$'] IN 'C:\файл.xls'[Excel 5.0;IMEX=2;hdr=Yes;];
наименование листа получаю путем лишних манипуляций, формирую строку запроса в переменную SQL_query и исполняю его
Visual Basic
1
2
3
SQL_query = "SELECT * FROM ['наименование листа$'] IN 'C:\файл.xls'[Excel 5.0;IMEX=2;hdr=Yes;]"
CurrentDb.QueryDefs("имя существующего запроса").SQL = SQL_query
DoCmd.OpenQuery SQL_query
Ответ:
Сообщение от alexpro1979
Если я создами таблицу с числовыми полями и переделаю запрос на добавление прокатит?
Не стоит этого делать. Всегда лучше данные из Excel загонять как текст во временную таблицу, а уже из нее инсертами в таблицы базы
Вопрос: Связь с данными Excel

Добрый день всем.
Есть такая задачка.
Есть файл .csv с выгруженными с сайта данными о заказах покупателей.
И есть файлы xls - прайсы поставщиков, в которых есть колонка типа "Ваш заказ", куда проставляется количество заказываемых товаров, и потом эти прайсы отправляются поставщикам и т.д.
Так вот, нужно автоматизировать именно этот момент переноса данных из csv в xls.
Насколько я понимаю, если в Access подключить связь с файлом Экселя - она все равно будет односторонняя, т.е. при изменениях, вносимых в файл Экселя - эти изменения будут видны в Access, но не наоборот, я правильно понимаю?.. Access не даст же вносить изменения напрямую?
В связи с этим вопрос чисто консультационный.
Я так понимаю, что единственный вариант в данном случае - открывать лист экселя через автоматизацию, и там находить нужную ячейку и заполнять?
Ответ: texnik-san, Просто изначально есть база, которая занимается другим делом, связанным с этими самыми прайсами и т.д., а именно данная задача - сугубо "побочный продукт", и данный функционал было бы неплохо тоже прилепить именно к базе, чтобы все было в одном месте)
Вопрос: Как получить данные из результата SELECT

Подскажите как вытащить все данные из результата SELECT в отдельные переменные, тоесть: @value1 = column1, @value2 = column2... сколько столбцов столько переменных

нужно для анализа данных

Если поняли суть вопроса то не читайте код, а то он вас еще запутает.

наведу пример кода который я бы хотел:
вместо BEGIN я буду использовать { вместо end }

Код SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
DECLARE @select1 unknowType?
DECLARE @select2 unknowType?
SET @select1 =  SELECT column1, column2, column3, DATE FROM table1
SET @select2 =  SELECT column1, column2, column3, DATE FROM table2
 
DECLARE @ROW
SET @ROW = 0
 
WHILE ROW < @select1. (SIZE? | LENGTH? | COUNT?)
{
  IF @select1[ROW].[DATE]  < @select2[ROW].[DATE]
  {
     --проверить все столбци на уникальность. Тоесть:
     -- данные @select1[row].column1 должны быть уникальными, между данными столбцов @select1[row]. (column2 | column3) и @select2[row]. (column1 | column2 | column3) 
     -- и так каждый столбец должен быть уникальным (стоблец date не трогаем)
 
     --проверка на нул
     IF datalength(@select1[ROW].[column1]) = 0 OR @select1[ROW].[column1] IS NULL 
     {
          -- нужно обновить @select1[row].[column1] = @select2[row].[column1]
          -- @select2[row].[column1] = null
          -- проверку на null нужно совершить с каждым столбцом (@select1[row].column1, @select1[row].column2, @select1[row].column3)
     }
--короче там еще много много условий, писать их нету смысла так как мне нужно знать как достучаться до нужной мне ячейки данных
  }
 ELSE IF --много кода
}
 
  @ROW = @ROW + 1;
}
код выше написан ~ по принципу работы C# с DataGrid
Ответ:
Сообщение от Astend
так понятней?
честно говоря, не очень...

Вы наверное удивитесь, но в SQL такое понятие, как "номер строки" отсутствует в принципе.
Есть некое множество строк, хранящихся в таблице и извлекаемых сервером по запросу select * from tab1 в том порядке, который ему представляется наиболее экономным по задействованным ресурсам.

Чтобы как-то понять, какая строка к чему относится, обычно используют некий "первичный ключ", однозначно идентифицирующий строку таблицы.

Аналогично нет доступа к полям таблицы по их номеру - только по имени. Связано это с возможной модификацией списка полей (например, при обновлении версии ПО). И кстати, отсюда настоятельные советы избегать * в списке select-а

Следующий непонятный момент - с чего вы решили, что строк в таблице ровно 2 и понадобятся только 2 переменные. Для получения итогов обработки каждой строки таблиц правильнее использовать либо временную таблицу, либо таблицу-переменную.

С учетом этого, для вашего примера могу предложить такой вариант "процедуры":
Код T-SQL
1
2
3
4
5
6
7
8
select coalesce(t.column1,t.column2) cr
into #cr
from table1 t;
 
-- и далее
select t.*
from #cr r
join table1 t on t.column1=r.cr or (t.column1 is null and t.column2=r.cr)
Хотя это вряд ли то, что вы имели в виду в первом посте

PS. В отличие от процедурных языков типа C# и т.п., SQL является декларативным языком. Иначе говоря, не учите сервер обрабатывать ваши данные, просто напишите, что вы хотите получить от него.