• ベストアンサー

Oracle8i ストアドプロシジャ

表名(テーブル名)等を変数にセットし、 いざ使おうとするとエラーになります。 何か関数を使えば、正しく動くものなのか。 ご存知の方、ご教授ください。 例:表領域名、DB_LINK名がデータとして存在する 変数A := 表領域名変数 || '表名' || DB_LINK名変数; select * from 変数A; 上記を「select * from ????(変数A);」 と、すれば出来そうな気がするのですが、????が何か、 または、別の方法があれば、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • msystem
  • ベストアンサー率42% (79/186)
回答No.3

たぶんですが、表名を変数にしたいのであれば、そのままでは動かないはずです。 確か、DBMS_SQLパッケージを使わないと、ストアドプロシージャでは使えないはずです。(動的問合せです。) DBMS_SQLパッケージについては、さまざまなところに使用法などがあると思いますので、検索してみてください。

ike_aqc
質問者

お礼

ありがとうございました。 DBMS_SQLの作法でちょっと苦労しましたが、大変助かりました。 また、今度も助けてください。

その他の回答 (2)

  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.2

バインド変数を使いたいなら :変数名 です。見当違いでしたらすみません。

ike_aqc
質問者

お礼

参考になりました。 次回もよろしく。

  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.1

エラーの種類が書かれていないので何とも言いようがありませんが、 とりあえずDBLINKの書式が間違っているように見えますが。 スキーマ名.表名@DBLINK名

ike_aqc
質問者

お礼

どうもです。 書式はご指摘の通りです。私のタイプミスでした。

関連するQ&A

  • Oracle8iのUPDATE文

    はじめまして、似た質問があったのですが解決には至らなかったので質問させていただきます。 表A 列1…主キー 列2 --中略-- 列8 表B 列1…主キー 列 --中略-- 列8 このような二つの表があり、列1は表Bにあるものはすべて表Aにありますが、 表Aの列1には表Bの列1にはないものがあります。 それ以外の列構造は同じですがデータはすべて異なっています。 表AとBの列1の値が同じものは、表Aの列8を表Bの列8で上書きをしたいです。 UPDATE 表A SET 表A.列8 = (SELECT 表B.列8 FROM 表B WHERE 表A.列1 = 表B.列2) WHERE 表A.列1 =ANY(SELECT 表B.列1 FROM 表B) このUPDATE文を実行すると、 ORA-01427: 単一行副問合せにより2つ以上の行が返されます。 というエラーになってしまいます。 検索などして、調べてみたのですが、このエラーから抜けることができません。 アドバイスをいただけたらと、投稿させていただきました。 よろしくお願いします

  • ストアドプロシジャ

    ストアドプロシジャの方法で削除処理をしたいと考えています。 ダイナセットはデータ件数が沢山あって、使いたくありません。 言語 VB6.0 DB ORACLEは9iで、oo4oで接続しています。 DBは テーブル名 売上 列名    データID       伝票日付 っていうふうになっていて、 例えば、伝票日付が今日のデータ分削除処理をしたいんですが いろいろなサイトを見てもいまいちわからないので投稿しました。 お願いします。

  • プロシージャーで(SELECT句とSUM関数)でデータがない状態の時

    プロシージャーで(SELECT句とSUM関数)でデータがない状態の時 例 テーブル名:表1 *************** * 個数* 連番 * *************** *  10 * 5  * *************** *  10 * 6  * *************** このようなテーブルの時で以下の処理をしたとき「何かをする;」を実行したいのですが実行できませんどうすればいいでしょうか? 変数が何もない状態なのでNULLで判定しようと思うのですが、うまくいきませんよろしくお願いいたします。 ************************************************** 変数 A NUMBER型を用意する SELECT SUM(個数) INTO A FROM 表1 WHERE 連番 < 4 IF A = NULL THEN 何かをする; END IF; **************************************************

  • INNER JOINについて

    こんにちは、現在下のWEBでSQLの勉強をしているのですが・・・。 http://www.pursue.ne.jp/jouhousyo/SQLDoc/select21.html INNER JOINについて質問です。 FROM 表名1 INNER JOIN表名2 ON 表名1.フィールド名 = 表名2.フィールド名 このONというコマンド、これは連結するフィールド名を表しているのですよね?これは、無くてはならないコマンドでしょうか。例えば、このウェブの問題だと、売上表.顧客CD=顧客表.顧客CD をする事で、顧客CDがソートされ、同じものが連結されてます。 もし、顧客CDの値が、二つの表で異なった場合、異なった値は切り捨てられ、その行は融合されないと言う事ですよね? なら、例えば普通に二つの表の値を比べたい場合、例えば、 A表: 売り上げ総合、日付、顧客表 B表: 顧客名、売り上げA、売り上げB という表があったとして、表Bの売り上げレートを表Aの総売上で割り、書く平均値を出したい場合、 SELECT  表B.売り上げA / 表A.売り上げ総合, 表B.売り上げB / 表A.売り上げ総合 FROM 表A INNER JOIN 表B として、ONを使わなくても大丈夫でしょうか?

    • ベストアンサー
    • MySQL
  • ACCESS97のMAX関数について

    ACCESS97を使用しています。 "関数"の使い方が全くわかりません。 (というより、SQLも含めて…)  テーブル"TBL_A"の"項目B" から最大値を変数SDHSに取得したいのですが どうすればいいのでしょうか?  Dim db As DATABASE Dim RS As Recordset Dim SDHS, strSQL As String Set db = CurrentDb() strSQL = "SELECT Max(項目B) FROM TBL_A ;" Set RS = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) SDHS = Max(項目B)

  • SQLがうまくいかない!

    SQLがうまくいかない! SQLについて、調べたんですが、わからないので教えてください! last_year(日付データ)関数 と round(日付データ,'書式')関数についてのご質問です。 select last_year('2007-01-01') from 表名; とやるとうまくいくのに 、 select round('2007-01-01','month') from 表名; とやるとエラーになってしまいます。 last_year関数では、'2007-01-01'は日付データとして扱われるのに、round関数では日付データとして扱われないのはなんででしょう? ちなみに、 select round(to_date('2007-01-01','yy-mm-dd'),'month') from 表名; とやるとうまくいきます・・・SQLの仕様ですか!? どなたか教えてください!宜しくお願い致します。

  • コマンドラインで実行

    DB2でコマンドラインから実行していますがうまくいきません。 select文で a   b ----------- 1   2 をテーブルが存在しない状態で出したいのですが db2 "select a,b from values(1,2) as table" としてもうまくいきません。 どのようにしたらいいでしょうか?

  • oracle 9i と SQL SERVER 2005 DBリンクにつ

    oracle 9i と SQL SERVER 2005 DBリンクについて とても困ってます。 よろしくお願いします。 仕事で、oracle 9iとSQL SERVER 2005をDBリンクさせて、oracle 9iのTableとSQL SERVER 2005のTableを結合させて、SELECT文を作成したいです。 本番環境は、DBサ―bとWebサーバは別々でとりあえずlocal開発環境を作成しています。 <確認したこと> ・global_names = Flase ・ODBCの設定はSQL SERVER 2005に接続確認しました。  →データソース名は、「SQLSRV」です。 ・inithsodbc.oraの設定    HS_FDS_CONNECT_INFO = SQLSRV    HS_FDS_TRACE_LEVEL = OFF ・LISTENER.ORAの設定(編集後再起動しました)  → (SID_DESC = (SID_NAME = HSODBC) (ORACLE_HOME = D:\oracle\Ora9IUTF) (PROGRAM = hsodbc) ・TNSNAMES.ORAの設定 HSODBC = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =localhost)(PORT = 1521)) ) (CONNECT_DATA = (SID = HSODBC) ) (HS = OK) ) ・DBリンク作成(小文字を認識するため、ダブルクォーテーションで囲います)   CREATE DATABASE LINK DB_LINK_SQLSRV   CONNECT TO "ユーザ" IDENTIFIED BY "パスワード" USING 'HSODBC'; ・SELECT文   SELECT * FROM テーブル名@DB_LINK_SQLSRV; 上記の手順ですが、サービス名が解決できません。

  • oracle10gと9iの違いについて

    お世話様です。 最近、DBサーバをoracle9iからoracle10gに変えることになったのですが、 oracle9iで select LEVEL, 項目1, 項目2 FROM テーブル1 のSQLが動いていたのですが、 oracle10gでは、このSQLが動かなくなり、 connect by区を指定するようにエラーが出てくるようになってしまいました。 oracleのバージョンによって、動かなくなると言うことはあるのでしょうか? それともORACLEの設定を変更すると動くようになるのでしょうか。 ご教授よろしくお願い致します。

  • phpの変数をmysqlへの命令文に含みたい

    mysqlへの接続等は完璧で問題なのは、phpの変数を含んだmysqlへの命令文です。 これは試行錯誤した上で間違いないと思いました。 具体的には $link = "接続の情報"  $table = "具体的なテーブル名" $result = mysql_query("select * from $table",$link) $row = mysql_fetch_array($result, mysql_assoc) としたときに print_r($row); が無反応です。 元のソースが今、手元にないので細かいところを間違えているかもしれませんが、select文で$tableを書く代わりに直接「具体的なテーブル名」と書いたらうまくいったので、phpの変数をphpからmysqlへの命令文に含む方法に問題があったと思った次第で、この方法を教えていただきたいです。 $linkまで含めて命令できるなら、その方法も教えていただきたいです。 よろしくお願いいたします。

    • 締切済み
    • PHP