Длинные запросы в Oracle и SQL Server - PullRequest
2 голосов
/ 31 мая 2011

Я работаю над приложением, которое подключается к Oracle или SQL Server и создает строку SQL для выполнения на сервере.Я обнаружил, что мой подход не работает в Oracle, когда строка SQL превышает ~ 4000 символов.У меня выше 4000, но только немного;Я предполагаю, что Oracle игнорирует некоторые пробелы / символы форматирования.

После того, как я нахожусь в процедуре Oracle, максимальная длина VARCHAR2, которую я использую, составляет 32 767 - я думаю, этого должно быть более чем достаточно, но я не могу передать VARCHAR2 в Oracleэто длиннее, чем ~ 4000.

Также я стараюсь максимально сократить различия между Oracle и SQL Server.

Какие другие подходы я могу использовать, чтобы преодолеть ограничение в 4000 в Oracle и SQL Server.

EDIT

Я согласен, что во многихВ некоторых случаях SQL-запрос длиной 4000 символов является чрезмерным и, вероятно, может быть переписан лучше или что базовые данные могут выиграть от реструктуризации.Часто псевдонимы некоторых таблиц более чем достаточны для развития событий.Но моя цель состоит в том, чтобы любой действительный запрос SQL возвращал те же результаты через мое приложение, что и через надежный инструмент, такой как SQL Developer .... потому что именно так говорят пользователи: ' Не говорите мнезапрос плохо написан, он отлично работает в $ tool, но не работает в вашем '

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

32000 VARCHAR2 виден только в PL / SQL (посмотрите @ this link http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7032414607769).

SQL VARCHAR2, как вы заметили, ограничен 4000 символами. Поскольку вы используете внешнююпродукт (то есть не PL / SQL, а .net), поэтому вы ограничены 4000 тыс. То есть, если вы решите использовать varchar2.

, чтобы обойти эту проблему, вам нужно будет использовать CLOB.

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

DECLARE
 sqlstr  CLOB;
 tCursor PLS_INTEGER;
 RetVal  NUMBER;
BEGIN
  sqlstr := 'SELECT * FROM DUAL';
  tCursor := dbms_sql.open_cursor;
  dbms_sql.parse(tCursor, sqlstr, dbms_sql.NATIVE);
  RetVal := dbms_sql.execute(tCursor);
  dbms_sql.close_cursor(tCursor);
END;
/
1 голос
/ 01 июня 2011

Используйте ТЕКСТ вместо типа VARCHAR.

0 голосов
/ 31 мая 2011

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

Я не собираюсь спрашиватьКто-нибудь может опубликовать запрос из 4000 символов, но, возможно, вы могли бы дать нам «орехи» и обсудить его?

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