Как использовать синтаксис CASE в хранимой процедуре на Netezza

я просто новичок в netezza (работает версия netezza Release 7.1.0.1-P1 [Build 37788]), я создал запрос для загрузки данных из другой базы данных, это мой запрос:

CASE INSTR(B.WIFI.WIFI_DETAIL.LOCATION, ';') WHEN 0 THEN B.WIFI.WIFI_DETAIL.LOCATION ELSE BTRIM(SUBSTR(B.WIFI.WIFI_DETAIL.LOCATION, 1, INSTR(B.WIFI.WIFI_DETAIL.LOCATION, ';')-1)) END AS POI_NAME

он работает идеально, но когда я вставляю хранимую процедуру, она была изменена с использованием решения @ScottMcG:

create or replace procedure SP_CREATE_TMP_F_WIFIID_AP_UTILISASI()
LANGUAGE NZPLSQL RETURNS INT4 AS
BEGIN_PROC

DECLARE

BEGIN
    /* CREATE TABLE TMP AP UTILISASI WITHOUT CLIENT */
    EXECUTE IMMEDIATE '
        create TABLE TMP_F_AP_UTILISASI as select AVG(ANN.THROUGPUT_V) as AVG_THROUGHPUT
            , SUM(ANN.BYTES_SENT) AS SUM_SENT
            , SUM(ANN.BYTES_RECIEVE) AS SUM_RECIEVE
            , (SUM(ANN.BYTES_RECIEVE)+SUM(ANN.BYTES_SENT)) AS TOTAL_AMOUNT
            , COUNT(ANN.C_MAC_ADDRESS) AS ASSOCIATED_CLIENT_COUNT
            , COUNT(ANN.USER_NAME) AS AUTHENTICATED_CLIENT_COUNT
            , MAX(ANN.TOTAL_WAKTU) AS MAX_SESSION_DURATION
            , ANN.AP_NAME
            , ANN.ASSO_TIME_V
            , ANN.PAKET_NAME
            , ANN.SSID
            , CASE INSTR(AD.LOCATION, ' || quote_literal (';') || ') WHEN 0 THEN AD.LOCATION ELSE BTRIM(SUBSTR(AD.LOCATION, 1, INSTR(AD.LOCATION, ' || quote_literal (';') || ')-1)) END AS POI_NAME
        FROM
            A.USR3.V_ALL_NMS_DETAIL AS ANN
        JOIN A.USR3.V_NMS_AP_DETAIL AS AD
            ON ANN.AP_NAME = AD.AP_NAME
        GROUP BY ANN.AP_NAME
            , ANN.ASSO_TIME_V
            , ANN.PAKET_NAME
            , ANN.SSID
            , AD.LOCATION
    ';

END;

END_PROC;

когда я вызываю процедуру, она все еще не работает:

ERROR: Cross Database Access not supported for this type of command

я звоню из базы данных A, и процедура строится в A

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

или, может быть, у кого-то есть другой запрос для этого запроса:

CASE INSTR(AD.LOCATION, ' || quote_literal (';') || ') WHEN 0 THEN AD.LOCATION ELSE BTRIM(SUBSTR(AD.LOCATION, 1, INSTR(AD.LOCATION, ' || quote_literal (';') || ')-1)) END AS POI_NAME

Спасибо


person ihsansat    schedule 20.11.2014    source источник
comment
вам нужно избегать кавычек в вашей строке SQL. ';') должно стать '';'')   -  person Frank Heikens    schedule 20.11.2014
comment
привет @FrankHeikens, это все еще ошибка ... ошибка ОШИБКА: атрибут ';' не найден   -  person ihsansat    schedule 21.11.2014


Ответы (2)


В вашем случае проблема не в CASE. При использовании динамического SQL в хранимой процедуре (например, EXECUTE IMMEDIATE) необходимо избегать кавычек, встроенных в текст. Вы можете сделать это двумя (по крайней мере) способами.

Вот два примера хранимой процедуры, использующей оператор CASE со строковыми литералами. Первый использует две одинарные кавычки '' для представления экранированной одинарной кавычки. Второй использовал функцию quote_literal.

Версия с экранированной кавычкой

CREATE OR REPLACE PROCEDURE SP_SAMPLE()
RETURNS INTEGER
EXECUTE AS CALLER
LANGUAGE NZPLSQL AS
BEGIN_PROC

BEGIN

EXECUTE IMMEDIATE 'UPDATE TESTING_TABLE SET COL1 =  CASE INSTR(COL2,'';'') WHEN 0 THEN ''NOT SEMICOLON'' ELSE ''SEMICOLON'' END';

END;
END_PROC;

QUOTE_LITERAL Версия функции

CREATE OR REPLACE PROCEDURE SP_SAMPLE()
RETURNS INTEGER
EXECUTE AS CALLER
LANGUAGE NZPLSQL AS
BEGIN_PROC

BEGIN

EXECUTE IMMEDIATE 'UPDATE TESTING_TABLE SET COL1 =  CASE INSTR(COL2,' || quote_literal (';') ||
    ') WHEN 0 THEN ' || quote_literal('NOT SEMICOLON') || ' ELSE ' || quote_literal('SEMICOLON') || ' END';

END;
END_PROC;

Вы можете ссылаться на документацию и примеры для запуска динамического SQL в Netezza здесь

person ScottMcG    schedule 20.11.2014
comment
привет @ScottMcG, я попробовал ваше предложенное решение, но ошибка: ОШИБКА: доступ к кросс-базе данных не поддерживается для этого типа команды, он не может быть кросс-базой данных? - person ihsansat; 21.11.2014
comment
когда я помещаю таблицы в одну базу данных, все равно появляется ошибка: ОШИБКА: доступ к кросс-базе данных не поддерживается для этого типа команды, возможно, у вас есть другое решение для решения этой проблемы, спасибо - person ihsansat; 21.11.2014
comment
Какую версию Netezza вы используете? Не могли бы вы обновить текст вашего вопроса полной новой версией с quote_literal? Также в какой базе данных создана хранимая процедура и из какой базы данных вы ее вызываете? Покажите нам полный контекст создания и выполнения SP, когда вы получаете ошибку перекрестного доступа к базе данных. - person ScottMcG; 21.11.2014

Попробуй это:

    create or replace procedure SP_CREATE_TMP_F_WIFIID_AP_UTILISASI()
LANGUAGE NZPLSQL RETURNS INT4 AS
BEGIN_PROC

DECLARE

BEGIN
    /* CREATE TABLE TMP AP UTILISASI WITHOUT CLIENT */
    EXECUTE IMMEDIATE '
        create TABLE TMP_F_AP_UTILISASI as select AVG(ANN.THROUGPUT_V) as AVG_THROUGHPUT
            , SUM(ANN.BYTES_SENT) AS SUM_SENT
            , SUM(ANN.BYTES_RECIEVE) AS SUM_RECIEVE
            , (SUM(ANN.BYTES_RECIEVE)+SUM(ANN.BYTES_SENT)) AS TOTAL_AMOUNT
            , COUNT(ANN.C_MAC_ADDRESS) AS ASSOCIATED_CLIENT_COUNT
            , COUNT(ANN.USER_NAME) AS AUTHENTICATED_CLIENT_COUNT
            , MAX(ANN.TOTAL_WAKTU) AS MAX_SESSION_DURATION
            , ANN.AP_NAME
            , ANN.ASSO_TIME_V
            , ANN.PAKET_NAME
            , ANN.SSID
            , CASE INSTR(AD.LOCATION, ";") WHEN 0 THEN AD.LOCATION ELSE BTRIM(SUBSTR(AD.LOCATION, 1, INSTR(AD.LOCATION, ";")-1)) END AS POI_NAME
        FROM
            A.USR3.V_ALL_NMS_DETAIL AS ANN
        JOIN A.USR3.V_NMS_AP_DETAIL AS AD
            ON ANN.AP_NAME = AD.AP_NAME
        GROUP BY ANN.AP_NAME
            , ANN.ASSO_TIME_V
            , ANN.PAKET_NAME
            , ANN.SSID
            , AD.LOCATION
    ';

END;

END_PROC;
person Pahlevi Fikri Auliya    schedule 20.11.2014
comment
спасибо за вашу помощь, но это все еще ошибка :(. ошибка: ОШИБКА: атрибут ';' не найден - person ihsansat; 21.11.2014