2015-07-09 3 views
0

У меня есть чрезвычайно простая хранимая процедура для поиска таблиц в конкретной схеме на основе параметров моей схемы и таблицы.Сохраненная процедура DB2 Возвращение Слишком много строк

Проблема заключается в том, что хранимая процедура возвращает ВСЕ строки для таблицы.

  • Он игнорирует мой второй параметр (имя_таблицы)
  • Я орфографическую ошибку параметр имя_таблицы и процедура возвращает все строки.
  • Если я пропущу параметр схемы, он не вернет никаких строк.

Любые идеи? Заранее спасибо. Сохраненная процедура приведена ниже.

CREATE OR REPLACE PROCEDURE FINDTABLECOLUMNS 
(IN SCHEMA VARCHAR(25), IN TABLE_NAME VARCHAR(25)) 
LANGUAGE SQL 
READS SQL DATA 
RESULT SETS 1 

BEGIN 

    DECLARE COLUMN_TABLE_LIST CURSOR WITH RETURN TO CALLER FOR 
    SELECT 
     ROW_NUMBER () OVER (ORDER BY TABLE_NAME , ORDINAL_POSITION) AS # 
     ,TABLE_NAME 
     ,COLUMN_NAME 
     ,SYSTEM_COLUMN_NAME 
     ,DATA_TYPE 
     ,LENGTH 
     ,COLUMN_TEXT 
    FROM QSYS2 . SYSCOLUMNS 
    WHERE TABLE_SCHEMA = UPPER (SCHEMA) AND TABLE_NAME = UPPER (TABLE_NAME) 
    FOR READ ONLY ; 

    OPEN COLUMN_TABLE_LIST ; 
END 
+1

Нужно ли вам ROW_NUMBER(), если у вас уже есть ORDINAL_POSITION? SCALE часто бывает удобнее в таких запросах, для количества десятичных знаков на (упакованных) десятичных или (зональных) числовых столбцах. – WarrenT

+1

Необходимо учитывать пределы объекта: схема - это varchar (128), то же самое, что и имя_таблицы. Кроме того, если схема меньше 8 символов, она добавит дополнительные пробелы для соответствия. Это в LUW, я не знаю других платформ. – AngocA

+0

http://angocadb2.blogspot.com/2015/07/esquemas-y-nombres-de-usuario-en-el.html – AngocA

ответ

2

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

CREATE OR REPLACE PROCEDURE FINDTABLECOLUMNS 
(IN SCHEMA VARCHAR(25), IN TABLE_NAME_PAR VARCHAR(25)) 
LANGUAGE SQL 
READS SQL DATA 
RESULT SETS 1 
BEGIN 
DECLARE COLUMN_TABLE_LIST CURSOR WITH RETURN TO CALLER FOR 
SELECT 
    ROW_NUMBER () OVER (ORDER BY TABLE_NAME , ORDINAL_POSITION) AS # 
    ,TABLE_NAME 
    ,COLUMN_NAME 
    ,SYSTEM_COLUMN_NAME 
    ,DATA_TYPE 
    ,LENGTH 
    ,COLUMN_TEXT 
FROM QSYS2 . SYSCOLUMNS 
WHERE TABLE_SCHEMA = UPPER (SCHEMA) AND TABLE_NAME = UPPER (TABLE_NAME_PAR) 
FOR READ ONLY ; 
OPEN COLUMN_TABLE_LIST ; 
END 
+1

Лично я бы, скорее всего, просто поместил '@' в начало моих имен параметров. – WarrenT

+1

Кроме того, 'SCHEMA' является зарезервированным словом и не должно использоваться для имени параметра или переменной. Также учтите, что имена таблиц и схем в каталоге могут быть в нижнем регистре. – mustaccio

+1

@mustaccio Избегание зарезервированных имен является одной из причин моего комментария к префиксу @ @, но я должен был объяснить, а? ;-) – WarrenT

Смежные вопросы