Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Netezza上的存储过程中使用用例syntac_Sql_Postgresql_Stored Procedures_Netezza - Fatal编程技术网

Sql 如何在Netezza上的存储过程中使用用例syntac

Sql 如何在Netezza上的存储过程中使用用例syntac,sql,postgresql,stored-procedures,netezza,Sql,Postgresql,Stored Procedures,Netezza,我只是netezza(运行版本netezza 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,

我只是netezza(运行版本netezza 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调用,并在

也许你有办法解决我的问题

或者,对于此查询,任何一个查询都可能具有另一个要相等的查询:

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
Thx

试试这个:

    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;

在你的情况下,问题不在于案件本身。在存储过程中使用动态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_文字函数版本

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字符串中转义引号。“;”)应成为“”;“”)你好@FrankHeikens,还是错误…错误:属性“;”不需要foundthx的帮助,但仍然存在错误:(.error:error:Attribute“;”not foundhi@ScottMcG,我已经尝试了您建议的解决方案,但是error:error:Cross-Database Access不支持这种类型的命令它不能跨数据库?当我将表放在一个数据库中时,仍然会出现错误:error:Cross-Database Access不支持这种类型的命令可能您已经解决此问题的另一个解决方案THX您正在运行哪个版本的Netezza?能否使用quote_文字将您的问题文本更新为全新版本?存储过程是在哪个数据库中创建的,您从哪个数据库调用它?向我们展示创建SP和执行SP的完整上下文t跨数据库访问错误。