2014-01-16 9 views
6

Ich habe eine rekursive Abfrage, die innerhalb einer Funktion eingekapselt, die eine hierarchische Umfrage „Struktur“ zurückgibt:Befestigungsfehler „Funktion array_length (bigint []) existiert nicht“

CREATE OR REPLACE FUNCTION get_survey_results(IN v_survey_id integer DEFAULT 1, IN v_survey_session_id integer DEFAULT NULL) 
    RETURNS TABLE(sort_order bigint[], survey_question_id integer, question_text text, required_ind smallint, survey_session_id integer, custom_text text, option_value integer, survey_scale_id integer, survey_scale_type_id integer, parent_survey_question_id integer, parent_survey_scale_option_id integer) AS 
$BODY$ 
BEGIN 
    RETURN QUERY 
     WITH RECURSIVE Survey_Structure (PATH, survey_question_id, question_text, 
      required_ind, survey_session_id, custom_text, 
      option_value, survey_scale_id, survey_scale_type_id, 
      parent_survey_question_id, parent_survey_scale_option_id, CYCLE) 
     AS (
      SELECT ARRAY[row_number() OVER (ORDER BY Survey_Question.sort_order)], Survey_Question.survey_question_id, Survey_Question.question_text, 
       Survey_Question.required_ind, Survey_Response.survey_session_id, Survey_Response.custom_text, 
       Survey_Scale_Option.option_value, Survey_Question.survey_scale_id, Survey_Scale.survey_scale_type_id, 
       0 as parent_survey_question_id, 0 AS parent_survey_scale_option_id, FALSE 
      FROM ...etc... 

ich einen survey_id passieren kann Diese Funktion (SELECT * FROM get_survey_results(1)) und es gibt alle Fragen und Antworten für diese Umfrage zurück.

Ich wollte die "Ebene" eines Knotens in der Hierarchie bestimmen, unter Verwendung von:

SELECT question_text, array_length(sort_order) AS level, 
    ...etc... 
FROM get_survey_results(1) 

Meine Abfrage gibt den Fehler

Funktion array_length (bigint []) existiert nicht

Die PostgreSQL array documentation verspricht, dass arrar_length() "anyarray" behandeln wird.

Was mache ich falsch? Gibt es ein optionales Paket, das ich installieren muss?

Antwort

17

Nähere Untersuchung der Dokumentation zeigt, dass array_length()zwei Parameter verwendet.

Ich hatte gerade

SELECT question_text, array_length(sort_order) AS level, ...

zu

SELECT question_text, array_length(sort_order, 1) AS level, ...

+2

Diskussion gibt es Änderungen auf der Mailing-Liste zur Zeit die Kurzversion hinzugefügt wird. Fühlen Sie sich frei zu wiegen. –