• 締切済み

ストアドファンクション中でconnectbyを使えない

いつもお世話になっています。 PL/pgSQLでストアドファンクションをコーディング中なのですが、 その中でconnectbyを使って階層問い合わせをしようとしています。 すると、コンパイル中にconnectbyを使っている付近でエラーになって しまいます。connectbyもストアドファンクションだと思うのですが、 ファンクション中に別のファンクションを呼び出すことはできないのでしょうか?

みんなの回答

回答No.2

#1回答者です。 失礼しました。ソース配布版パッケージには、関数として提供されているのですね。

参考URL:
http://www.thinkit.co.jp/free/marugoto/2/1/23/1.html
owen10
質問者

お礼

見当違いの質問をしてしまいましてすいません。 文法的なコンパイルエラーでした。 正しく、connectbyもファンクション中から利用できます。

回答No.1

Oracleの独自機能を、PostgreSQLで使おうとしていませんか? 標準SQLでは「WITH」だと思いますが、PostgreSQLでは未サポートだと記憶しています。

owen10
質問者

補足

ご回答ありがとうございます。 connectbyはPostgreSQLの独自機能です。 最初はOracle同様に、「START WITH」で階層問い合わせをしようとしたのですが、PostgreSQLではサポート外だったので調べた結果、connectbyを使おうとしています。 【参考URL】 http://www.thinkit.co.jp/free/marugoto/2/1/23/1.html

関連するQ&A

  • ストアドファンクションのエラーについて

    PostgreSQLでストアドファンクションを作成しました。 ファンクションの内容は下記の通りです。 CREATE FUNCTION getRenban (VARCHAR) RETURNS VARCHAR(7) AS ' DECLARE key ALIAS FOR $1; code VARCHAR(7); code2 VARCHAR(2); code5 VARCHAR(5); renban INTEGER; new_code VARCHAR(7); BEGIN SELECT MAX(code) INTO code FROM M_ITEM WHERE flg = TRIM($1); code2 := TRIM($1); IF code IS NULL THEN renban := 1; ELSE SELECT SUBSTR(code, 2) INTO code5; SELECT TO_NUMBER(code5, ''99999'') INTO renban; renban := renban + 1; END IF; code5 := ''''; SELECT TO_CHAR(renban, ''00000'') INTO code5; SELECT code2 || code5 INTO new_code; RETURN new_code; END; ' language 'plpgsql' ; コンソール上で下記のコマンドを実行したらエラーが出力されました。 SELECT getrenban('01'); 出力されたエラーの内容は下記の通りです。 ERROR: value too long for type character varying(5) CONTEXT: PL/pgSQL function "getrenban" line 19 at SQL statement お恥ずかしいですがいくらコードを見てもどこが原因なのかわかりません。 申し訳ありませんがご教授お願いできませんでしょうか。 昨日から悩んでいます。 どうか助けて下さい、宜しくお願いします。

  • ストアドプロシージャの引数にフィールド名を指定したい

    以下のようにストアドプロシージャを作成し、 ------------------------------------------------------------ CREATE FUNCTION test(integer) RETURNS integer AS'  DECLARE   aaa ALIAS FOR $1;  BEGIN   IF aaa BETWEEN 1 AND 5 THEN    RETURN 5;   ELSIF aaa BETWEEN 6 AND 10 THEN    RETURN 10;   ELSIF aaa BETWEEN 11 AND 15 THEN    RETURN 15;   END IF;  END;' LANGUAGE 'plpgsql'; ------------------------------------------------------------ 以下のようなSQL構文でこのプロシージャを使用したいと思っています。 ------------------------------------------------------------ select test(フィールド名) from テーブル名; ※「フィールド名」のフィールドにはinteger型のデータが入っています。 ------------------------------------------------------------ が、このSQLを実行すると以下のようなエラーが出ます。(CSE使用) ------------------------------------------------------------ WARNING: Error occurred while executing PL/pgSQL function test WARNING: at END of toplevel PL block WARNING: Error occurred while executing PL/pgSQL function test WARNING: at END of toplevel PL block SQL実行中に以下のエラーが発生しました。 WARNING: at END of toplevel PL block ------------------------------------------------------------ このように、ストアドプロシージャの引数にフィールド名を指定することはできないのでしょうか。 どなたかご教示ください。

  • PL/pgSQLの直接実行

    PL/pgSQLのことで教えてください。 これまで SQL Server を使っていましたが、PostgreSQL に移行しています。 Npgsql で、VB.Net から接続しようと思っています。 PL/pgSQLで、ストアドファンクションなどを定義するのではなく、PL/pgSQLスクリプトを 直接実行することはできないのでしょうか? SQL Server では、T-SQLのスクリプトを直接実行できました。 例えば ManagementStudioのクエリ実行画面にスクリプトを入力して実行したり、 VBからだと、SqlCommand の CommandText に T-SQLを書いて実行したり、という ことです。 pgAdminIIIのSQLエディタや、NpgsqlのNpgsqlCommandで同様のことをやろうとすると エラーになります。 何か良い方法があるのでしょうか?

  • ストアドファンクションの再帰呼び出しについて

    「ストアドファンクションの再帰呼び出し」はできないのでしょうか。 hoge関数をhoge関数の中で呼び出しています。 hoge関数では、条件に当てはまらないと第三引数を、 編集して再帰呼出しをしています。 再帰呼出しする条件を引数に設定して実行すると、以下の実行結果(ERROR)が表示されます。 <実行結果> mysql> select hoge('7','1234','1234567891012'); ERROR 1424 (HY000): Recursive stored functions and triggers are not allowed. よろしくお願いします。

    • ベストアンサー
    • MySQL
  • ストアドファンクションがうまく作成できない

    SQL Server 2005 にて、 以下のようなストアドファンクションを作成しようとしても、 「メッセージ 156、レベル 15、状態 1、プロシージャ TestKansu、行 30 キーワード 'end' 付近に不適切な構文があります。」 といったエラーメッセージが表示されてしまい、 うまく作成できません。。 文法など、いろいろ調べてみたところ、特に問題なさそうな 感じではあるのですが。。 どこに問題があるのか、どなたかご教授願えないでしょうか? なにとぞ、よろしくお願いいたします。 -------------------------------- use tempdb go -- 呼び出し形式 create function TestKansu ( @Date as datetime, @Type as varchar(1) ) returns @ReturnTable table ( StartDate varchar(8), EndDate varchar(8) ) as begin if @Type is null begin raiserror('正しいtypeを指定してください',-1,-1) end if @Date is null begin SET @Date = getdate() end if @Type = '0' begin insert into @ReturnTable select convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as StartDate, convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as EndDate, end if @Type = '1' begin insert into @ReturnTable select convert(varchar(8), @Date, 112) as StartDate, convert(varchar(8), @Date, 112) as EndDate end return end --------------------------------

  • ストアドプロシージャでのパラメータのデータ型の質問

    いつもお世話になっております。たびたびの質問で恐縮です。 ストアドプロシージャでのパラメータのデータ型が設定できず困っております。たとえば次はパラメータの文字を表示させるものです。 CREATE OR REPLACE PROCEDURE test(p VARCHAR2(10)) IS t VARCHAR2(10); BEGIN t:=p; DBMS_OUTPUT.PUT_LINE(t); END; / コンパイルエラーになるので、パラメータのデータ型を、VARCHAR2のように(10)を取るとうまくいきます。しかし、変数定義の「t VARCHAR2(10)」の(10)を取ると文字列の制約制限からはずれるとのエラーになります。 VARCHAR2というのは、PL/SQLの変数あるいはパラメータではどのように記述すればよろしいのでしょうか。 基本的なことを理解しておらず、申し訳ありません。 どうか、よろしくお願いいたします。

  • 動的SQLよりファンクションをコールできますか?

    PL/SQLで教えていただきたいのです。 (1)動的SQLより、ファンクションをコールできますか? (2)もしできるなら、どういった書式になるのでしょうか? 以下のようなコードを書いていますが、2行目でコンパイルエラーになってしまいます。 vs2Sql := 'SELECT a.CLM1,' || FunctionXXX(a.CLM1) || ' AS CLM2 ' || 'FROM TargetTBL a WHERE ...'; よろしくお願いいたします。

  • SQLServer ストアド レスポンス

    SQLServer ストアド レスポンス いつもお世話になります。 約100万件のテーブルから20行程度抽出するストアドがあります。 問合せ画面で使用していますが、通常は問題なくサクサク動くのですが、突然遅くなる時があります。 インデックスは付いてます。 そんな時、クエリアナライザで、直接ストアドを起動した後、再度画面から問い合わせると通常のスピードに戻ります。 ストアド直接起動時も最初は遅く、2回目以降は通常スピードです。 偶然なのかどうか調査中ですが、どなたかこんな経験&対処された方おりましたら、ご教授頂けないでしょうか。 SQLServer2000+VB.NETで開発してます。

  • pl/pgsqlでの、エラーコードとファイル操作の方法

    pl/pgsqlのFunctionで、ファイル操作はできますか? また、FunctionでException発生時にエラーコードやエラーメッセージは取得できますか? Windows,PostgreSQL8.2.3です。

  • オラクルについての質問

    オラクルについての質問 いつもお世話になっております。 オラクル初心者でヴァージョンは11gを使用しております。 そしてSql developerで 現在ストアドプロシージャでカーソルを使った割と単純な PL/SQLを作成しているのですが、コンパイルエラー が出ており、その原因が掴みきれないでいるのですが、 例えばステップインの様な機能はないでしょうか。 順を追ってどこにエラー原因があるのかを確認したいのです。 ご教示の程、宜しくお願い致します。