お世話になります、

VBからoo4o接続でストアドを呼ぶ方法を探しています。

<現在の状況>
■ストアドパッケージ
・次のように値を返すストアドパッケージがあるとします。これを CreatePLSQLDynaset で実行して、レコードセットを取得します。(OraDynaset)

create or replace package testp is
procedure GetTestm(key in number, cu out CHAR);
end;
/

create or replace package body testp is

procedure GetTestm(key in number,cu out CHAR) is
begin
select NAME into cu from TEMP where STATUS=key;
end;

end;
/

■VBのボタンイベント
Private Sub Command1_Click()

Dim dbname
Dim cnuser

'** サービス、ユーザ設定
dbname = "aaa"
cnuser = "bb/bb"
'** oo4o 接続
Set GoORASESSION = CreateObject("OracleInProcServer.XOraSession")

 Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, &H0)

'** リクエリレコードセットオープン
Set Recordset = GoORADATABASE.CreatePLSQLDynaset("Begin testp.GetTestm (1,:cu); end;", "cu", &H0)

End Sub

これを実行したところ以下のようなエラーが出ました
<エラー>
____________________________
実行時エラー '440'

SQL実行エラー,ORA-06550:行:1、列:7
PLS-00306:'GETTESTM'の呼び出しで、引数の数または型が正しくありません
ORA-06550:行:1、列:7
PL/SQL:Statement ignored
_______________________________

というエラーが出てしまいます、引数の数は合っていると思うのですが、どこがお菓子のでしょうか?

よろしくお願いします。

A 回答 (6件)

以下にサンプルをご提供します。

参考にして下さい。
尚、関数の詳細は、oo4oを使用するVBの専門書か又は、Webで調べて下さい。

' Oracleに接続
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.DbOpenDatabase("cims", "test/test", 0&)

'パラメータの型
Const ORAPARM_INPUT = 1
Const ORAPARM_OUTPUT = 2
Const ORAPARM_BOTH = 3

Const ORATYPE_VARCHAR2 = 1
Const ORATYPE_NUMBER = 2

' SQL実行に使用するVB変数
Dim v_sqlstmt As String
Dim v_retcode As Integer

'パラメータのバインド
OraDatabase.Parameters.Add "P1", "", ORAPARM_INPUT
OraDatabase.Parameters("P1").serverType = ORATYPE_VARCHAR2
OraDatabase.Parameters("P1").Value = "1"

OraDatabase.Parameters.Add "P2", "", ORAPARM_INPUT
OraDatabase.Parameters("P2").serverType = ORATYPE_NUMBER
OraDatabase.Parameters("P2").Value = "1"

OraDatabase.Parameters.Add "P3", "", ORAPARM_OUTPUT
OraDatabase.Parameters("P3").serverType = ORATYPE_NUMBER
OraDatabase.Parameters("P3").MinimumSize = 2

'PL/SQLブロックからプロシージャを呼ぶ
v_sqlstmt = "begin test.main(:P1, :P2, :P3); end;"
v_retcode = OraDatabase.ExecuteSQL(v_sqlstmt)

' 返り値を表示
MsgBox OraDatabase.Parameters("P1").Value
MsgBox OraDatabase.Parameters("P2").Value
MsgBox OraDatabase.Parameters("P3").Value

'パラメータリストからパラメータを削除
OraDatabase.Parameters.Remove "P1"
OraDatabase.Parameters.Remove "P2"
OraDatabase.Parameters.Remove "P3"
    • good
    • 0

よく見ると[cu]も使用してますねだからストアドの受けにINが必要でした。


ストアドをあんまり見てませんでした・・・
いつもCreatePLSQLDynasetを使用しないで、CreateSqlを使用していたので、結構推測部分が多いアドバイスになってしまいました。

あと
GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT
ですが、パラメータに1を渡すという意味です。
ですので、
"Begin testp.GetTestm (1,:cu); end;", "cu", &H0
の1を
"Begin testp.GetTestm (:key,:cu); end;", "cu", &H0
と変更しました。

環境がないと、正確な事が言えませんね。。。
以後気をつけます。。。m(__)m
    • good
    • 0

1.

http://www.fukkey.dyndns.org/pins/search/search. …で「くるくるおらくる会議室」で調べる
2.hyu_yaさんの言われたようにサンプルを見る
3.エクスローラのアドレスバーに [Search CreatePLSQLDynaset VB]などと打ちこんで、ネット全体をMSNで検索する

いろいろな調べ方がありますよ。
    • good
    • 0

パラメータ(引数)の設定がされてないようですが・・・


以前、自分も似たような?(その時はVBAでしたが)事が有り
調べてみると身近なところ(自分の端末に!)
OO4Oが入っているんですよね?であれば、
[スタート]→[プログラム]→[OracleForWindows xx]
→[Oracle Objects for OLE X.X Documentation]より
「パラメータ」とか「ADDメソッド」で検索すると
サンプルが載ってます!!
既に知っていて、それでも・・・という場合はごめんなさい。<m(__)m>
    • good
    • 0

追記です。


定数を書くのを忘れてました。

Const ORAPARM_INPUT = 1
Const ORAPARM_OUTPUT = 2
Const ORAPARM_BOTH = 3

Const ORATYPE_VARCHAR2 = 1
Const ORATYPE_NUMBER = 2
Const ORATYPE_SINT = 3
Const ORATYPE_FLOAT = 4
Const ORATYPE_STRING = 5
Const ORATYPE_VARCHAR = 9
Const ORATYPE_DATE = 12
Const ORATYPE_UINT = 68
Const ORATYPE_CHAR = 96
Const ORATYPE_CHARZ = 97

この回答への補足

ストアドを以下のように書き直したところうまくいきました
<改良したストアド>
create or replace package testp as
cursor c1 is select * from TEMP;
type testmcu is ref cursor return c1%rowtype;
procedure GetTestm(key in varchar2, cu in out testmcu);
end;
/

create or replace package body testp is

procedure GetTestm(key in varchar2, cu in out testmcu) is
begin
open cu for select * from TEMP where STATUS = TO_NUMBER(key);
end;

end;
/

質問であげているストアドは何がいけなかったんでしょうか?

補足日時:2001/11/14 10:06
    • good
    • 0

オラクル環境が、今無いので未検証です。

。。


'** DBセット
Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, &H0)

'** パラメータセット
GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT
GoORADATABASE.Parameters("key").ServerType = ORATYPE_NUMBER
GoORADATABASE.Parameters.Add "cu", 0, ORAPARM_OUTPUT
GoORADATABASE.Parameters("cu").ServerType = ORATYPE_CHAR

'** リクエリレコードセットオープン
Set Recordset = GoORADATABASE.CreatePLSQLDynaset("Begin testp.GetTestm (:key,:cu); end;", "cu", &H0)

この回答への補足

パラメタセットを行っても同じエラーが出てしまいます、
ちなみに
GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT
の「1」とは何を意味しているのでしょうか?

VBの関数一覧みたいな情報ってどこで見ればいいのでしょうか?

補足日時:2001/11/14 09:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQLとPL/SQLの違いなど

いま会社でPL/SQLのシステムを構築する話が持ち上がっているのですが
SQLとPL/SQLでどのような違いがあるのかがいまいち分かりません。
あと、PL/SQLの開発システムを導入しようとするときに
どのようなソフトを入れればよいのかも、よく分かっていない始末です。

単純な質問なのかもしれませんが、わかる方よろしくお願いします。

Aベストアンサー

>SQLとPL/SQLでどのような違いがあるのかがいまいち分かりません。

簡単に言いますとBASICに似た構文のプログラムをオラクル(DBMS)がSQLと同じレベルで処理してくれるものです。
他のデータベースで言うところのストアドプロシージャと同じですからロードはオラクル内に格納されオラクル内で実行されます。


>あと、PL/SQLの開発システムを導入しようとするときにどのようなソフトを入れればよいのかも、よく分かっていない始末です。

サーバにオラクルがインストールされていれば何もいらないと思います。
もちろん開発はテキストエディタになってしまいますが。

QVB で =Right([nendo],2) & "/06" はどういう事ですか?Right([nendo],2)は?

VB で =Right([nendo],2) & "/06" はどういう事ですか?Right([nendo],2)は?

Aベストアンサー

&amp;="&"
&amp;="""
=Right([nendo],2) &amp; &quot;/06&quot  -> =Right([nendo],2) & "/06"
[nendo]はアクセスのフィールド名か(アクセスのVBA?)。[]で囲むから。
中身は、#2でご指摘の年度で2007とかは行っているのでしょう。
Right関数は文字列の右側、最後から文字数を指定して切り出す。
&は文字列を結合する演算子。
/06をこの順序で結合するもの。

QPL/SQLについて

PL/SQLについて

お世話になります。
現在Oracle 11gと.Net C#で開発をしている物です。

正直どちらも初心者で悪戦苦闘している日々ですが、
PL/SQLのカーソルについて知りたい事があります。

PL/SQLでカーソルを作成しました。
そしてその同一ストアドプロシージャ文の中で、
先のカーソルの結果で得られた値から別の新たなカーソル
でまた新たな結果を返すと言う様な、二重カーソルの様な
事は可能でしょうか。

どなたかご親切な方、ご教授頂きたく宜しくお願い致します。
出来れば、サンプルや、HP等ご紹介頂ければありがたく
思います。

Aベストアンサー

もちろん書いてあると思いますよ。
読んでみてください。

参考URL:http://download.oracle.com/docs/cd/E16338_01/appdev.112/b56260/toc.htm

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QSQL*Plus内でPL/SQL、SQLを実行するシェルスクリプトを書

SQL*Plus内でPL/SQL、SQLを実行するシェルスクリプトを書いています。

イメージ
sqlplus scott/tiger << EOF
  declare
    aaa number;
  begin
    -- *1
    select col1 into aaa from test1;
  end;
  /

  -- *2
  define a=1
  define b=1
  @test.sql
EOF


ここで*1にて例えば複数行が返ってくるなどのエラーが
発生した場合、*2以降のSQLを実行せずにSQL*Plusから抜けたいのですが
どのようにすればよいかわかりますでしょうか。

whenever sqlerror exit 255

などはPL/SQL内の論理エラーはハンドリングしてくれないようです。

よろしくお願いします。

それかdefineや@マーク指定によるsqlファイルの取り込みを
PL/SQLの中で実行できる方法を教えていただく方法でも
当方が実施したいことはできるのでそれでもかまいません。

Aベストアンサー

SQLPLUSで投入したPL/SQL無名ブロック内でのエラーでも、「whenever sqlerror ~」で、
キャッチできますよ。少なくともWindows版SQLPUSは、そういう動作です。
発生源が、SQL文であっても、PL/SQL無名ブロックでも、ORA-nnnnnのエラーを拾わないと
「whenever sqlerror ~」の意味が無いですからね。

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

QPL/SQLでのSQL文法

こんにちは。教えてください。
PL/SQLを使うのが初めで戸惑っています。
まず、PROCEDUREで
===========================
BEGIN

SELECT NAME FROM TABLE1 WHERE NAME='tanaka';

END;
/
===========================
このように書いて実行させようとすると、「コンパイルエラー」
「INTO句はこのSELECT文に入ります」というエラーが出ます。
SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに??

ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて
わかりませんでした。
PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。
よろしくお願いいたします。

Aベストアンサー

コーディング例です。

**************************************************
*非ループ処理の例
**************************************************
.CREATE OR REPLACE PROCEDURE JOB1
.IS
.
.  w_NAME1  CHAR(10);
.
.BEGIN
.
.  SELECT NAME1 INTO w_NAME1 FROM TABLE1
.  WHERE TBL1_KEY = 'tanaka';
.
.  UPDATE TABLE2 SET NAME2 = w_NAME1
.  WHERE TBL2_KEY =  'tanaka';
.
.  COMMIT;
.
.EXCEPTION
.  WHEN OTHERS THEN
.    ROLLBACK;
.END;
./
**************************************************
*ループ処理の例
**************************************************
.CREATE OR REPLACE PROCEDURE JOB2
.IS
.
.  w_TABLE1 TABLE1%ROWTYPE;
.
.  CURSOR  c_TABLE1 IS
.  SELECT  NAME1
.  FROM   TABLE1
.  ORDER BY NAME1;
.
.BEGIN
.
.  OPEN c_TABLE1;
.
.  LOOP

.    FETCH
.      c_TABLE1
.    INTO
.      w_TABLE1;
.    EXIT WHEN c_TABLE1%NOTFOUND;
.
.    UPDATE TABLE2 SET NAME2 = w_TABLE1.w_NAME1
.    WHERE TBL2_KEY = w_TABLE1.w_TBL1_KEY;
.
.  END LOOP;
.
.  CLOSE c_TABLE1;
.
.  COMMIT;
.
.EXCEPTION
.  WHEN OTHERS THEN
.    ROLLBACK;
.END;
./

先頭のピリオドは無視してください。どこかにミスがあったらごめんなさい。

コーディング例です。

**************************************************
*非ループ処理の例
**************************************************
.CREATE OR REPLACE PROCEDURE JOB1
.IS
.
.  w_NAME1  CHAR(10);
.
.BEGIN
.
.  SELECT NAME1 INTO w_NAME1 FROM TABLE1
.  WHERE TBL1_KEY = 'tanaka';
.
.  UPDATE TABLE2 SET NAME2 = w_NAME1
.  WHERE TBL2_KEY =  'tanaka';
.
.  COMMIT;
.
.EXCEPTION
.  WHEN OTHERS THEN
.    ROLLBAC...続きを読む

QDimとは・・・

変数の宣言をする時の「Dim」は何の略でしょうか…
ほかにもプログラムをやっていて、何の略かわからないとなかなか覚えられません。よいサイトをご存知の方お願いします。

Aベストアンサー

ryくごの胃委細とを探したんですがなかなか良いところがありません。

http://www.geocities.co.jp/SiliconValley-Bay/6849/

http://www.geocities.co.jp/Milkyway-Orion/5125/dic.htm

ちなみにDImensionは「配列」などの意味です。

参考URL:http://www.bekkoame.ne.jp/~proud/abb-words.html

QブロンズからPL/SQL 開発者の資格取得を目指していいか

ORACLE MASTER Bronze Oracle Database 11gは取得しました。
次はORACLE MASTER Silver Oracle PL/SQL Developerの資格を取得したいと思います。
ですが、先にORACLE MASTER Silver Oracle Database 11gを取得しておいた方が、PL/SQLの資格を取得するにあたって知識の習得が楽になるのでしょうか?

Aベストアンサー

実際受けてみるとわかりますが、PL/SQLの試験とデータベースの試験は殆ど被る内容がありません。
認定する技術がプログラミングだから当然といえば当然です。
この試験の合格に必要なのは、PL/SQLの構文とPL/SQLでできないことを明確に把握していることであって、それ以上ではありません。
(処理効率のいいモジュールを書く能力は問われません)

だから、PL/SQLを受けて構わないと思いますよ。

QVB2010からPROCEDUREを実行でエラー

VB2010を使っています。
Oracleのプロシージャを呼び出しするのですが、
以下のエラーが出て困っています。

ORA-06550:行1、列7:
PLS-00801:内部エラー[22503]
ORA-06550:行1、列7:
PL/SQL:Statement ignored

実際のPG

Public Function ORA_EXECUTE(ByVal strSQL As String) As Boolean
' データ格納領域の初期化
Dim v_return_flg As Boolean
Dim Ora_Cnn_bk As OracleConnection
Dim Ora_Cmd_bk As OracleCommand


' Oracle接続情報の初期化
Ora_Cnn_bk = New OracleConnection
Ora_Cmd_bk = New OracleCommand
' Oracleへのコネクションの確立
Ora_Cnn_bk.ConnectionString = "User Id=(ユーザ名); Password=(パスワード); Data Source=(接続文字列)" & "; Pooling=false"

Ora_Cnn_bk.Open()

v_return_flg = False
Try
Dim oTYPE_CHAR As OracleDbType = OracleDbType.Char
Dim oPARM_OUTPUT = ParameterDirection.Output

'バインド変数のセット
Ora_Cmd_bk.Parameters.Add("AAA", oTYPE_CHAR)
Ora_Cmd_bk.Parameters("AAA").Value = " "
Ora_Cmd_bk.Parameters("AAA").Direction = oPARM_OUTPUT
Ora_Cmd_bk.Parameters("AAA").OracleDbType = oTYPE_CHAR

'ストアドプロシージャ実行
Ora_Cmd_bk.CommandType = CommandType.StoredProcedure
Ora_Cmd_bk.CommandText = strSQL
Ora_Cmd_bk.Connection = Ora_Cnn_bk
Ora_Cmd_bk.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("SQL(" + strSQL + ")" + Chr(13) + ex.Message, "確認", MessageBoxButtons.OK)
Finally
' コネクションを閉じる
Ora_Cnn_bk.Close()
' Oracle接続情報のクリア
Ora_Cnn_bk = Nothing
Ora_Cmd_bk = Nothing
End Try
' データ返却
Return v_return_flg
End Function

Oracle側のプロシージャは、別PGで使用していて
C++からアクセスし使える状態です。

お分かりになる方教えてください。
m(_ _)m

VB2010を使っています。
Oracleのプロシージャを呼び出しするのですが、
以下のエラーが出て困っています。

ORA-06550:行1、列7:
PLS-00801:内部エラー[22503]
ORA-06550:行1、列7:
PL/SQL:Statement ignored

実際のPG

Public Function ORA_EXECUTE(ByVal strSQL As String) As Boolean
' データ格納領域の初期化
Dim v_return_flg As Boolean
Dim Ora_Cnn_bk As OracleConnection
Dim Ora_Cmd_bk As OracleCommand


' Oracle接続情報の初期化
Ora...続きを読む

Aベストアンサー

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14093&forum=7

もしこのような状況で、プロシージャ名が全角であることが起因し、プロシージャ名の
変更が行えないなら、別プロシージャを作成してラップすればいいと思います。

また、こちらのように、プロシージャ名にパラメータまで設定しているなら外してください。
http://otn.oracle.co.jp/forum/message.jspa?messageID=28015837&#28015837


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング