以下のVIEWをPROCEDURE内で使用しています。

CREATE OR REPLACE VIEW VW_KAIIN
(CODE,NAME,TEL,STARTYMD)
AS
SELECT * FROM KAIIN
WHERE STARTYMD <= TO_CHAR(SYSDATE,'YYYYMMDD')

※STARTYMDには有効な開始日付が入ります。

条件部分でSYSDATEではまずいことになり、
特定の日付を指定しなければならなくなりました。


VIEW自体にパラメータ渡しはできないということで、

CREATE OR REPLACE PROCEDURE TABLE_B_UPDATE
(I_YYYY IN TABLE_A.YYYYY%TYPE,
I_MM IN TABLE_A.MM%TYPE,
I_DD IN TABLE_A.DD%TYPE,)

PROCEDURE内でI_YYYY、I_MM、I_DDを条件に変更した
VIEWを動的に作成して、処理をしたいのですが、
こういった事は可能でしょうか?

そのまま書いてみましたが、CREATE部分でエラーが出てしまい、コンパイルできませんでした。

もし不可能である場合は、代替案をご教授いただけるとありがたいです。

どうかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

プロシージャ内でも動的SQLを使えばDDLの実行はできます。

試してみてください。
set serveroutput on
declare
w_str varchar2(1000);
begin
--TABLE作成
execute immediate 'create table test_table(val varchar2(100))';
--データ投入
execute immediate 'insert into test_table values (:val)' using 'テスト';
--VIEW作成
execute immediate 'create view test_view as select * from test_table';
--VIEWからSELECT
execute immediate 'select val from test_view' into w_str;
--結果出力
dbms_output.put_line(w_str);
--TABLE,VIEW削除
execute immediate 'drop table test_table purge';
execute immediate 'drop view test_view';
exception
when others then raise;
end;
/
set serveroutput off

ただ、今回の質問はkouta77さんのおっしゃるとおりVIEW動的に作成する意味がよくわかりませんね。
やりたいこと、目的を明確にしてもらうと何かアドバイスできるかもしれません。

この回答への補足

元々、前任者が作っておったもので、
VIEW自体は、他のプログラムで呼び出したり、共通で使っているのは
間違いないと思います。

私自身、オラクルやPLSQLに触れるのが初めてなものですから、
VIEW自体でパラメータが使えたら一番よかったのですが。

プロシージャ内でVIEWの項目が基本軸として使用されており、
安易に、既存のVIEWのコピーを、プロシージャ内のパラメータを使用して、もうひとつ作ったら、いけるかなぁ、と思ってやってみたところ、ダメでしたので、質問させていただきました。

上記方法ためさせていただきます。
ありがとうございます。

補足日時:2011/04/12 19:24
    • good
    • 0
この回答へのお礼

上記方法でやりたいことが作成できました。
VIEW作成以外もご紹介いただき感謝です。
ありがとうございました。

お礼日時:2011/04/13 17:58

プロシージャ―内でCREATE文(DDL文)は記述できません。




そもそもVW_KAIINをどう使いたいのですか?
いちいちVIEWにする必要はなくて、プロシージャ―内でデータをSELECTする時に条件文を付けるのでは
駄目なんですか?
この質問文を見る限りではVIEWにする意図が分かりません。

この回答への補足

他のプロシージャや、プログラム内からも、共通で使いたいので、
VIEWにしております。

まだ、PLSQL自体、見始めて間もないもので、見当違いことを言ってたらすいません。

補足日時:2011/04/12 18:58
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

関連するカテゴリからQ&Aを探す

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

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

QJavascriptからJSPファイル(~.jsp)を起動する時、引数

JavascriptからJSPファイル(~.jsp)を起動する時、引数を渡したい。また、jspファイル終了後、jspからのリターン値(もくしは引数)をjavascriptで参照したい。
 ※要するに javasript → jsp 起動
 起動jspファイル終了時、javascript側でjspファイルの処理結果を判定したい。

どうすれば良いですか?

Aベストアンサー

要するに、JAVSCRIPTを使って、サーバーサイドのJSPとAJAX(非同期通信)
するという意味ですかねえ?
 それなら、PHPやCGIの場合とあまりちがわないと思うんですが...
あまりくわしくないですが、
HTML(JAVASCRIPT)側からPOST、GET要求したデーターは、
JSP側は
 「request.getParameter(java.lang.String name)」
で受け取れます。
逆にheader指定は、
<%@ page contentType="text/html; charset=utf-8" %>
で、出力は
<% out.print(hoge); %>とか<%= hoge %>
みたいに、ASPやPHPとかまあ、みんな同じようなもんですね。
ヒアドキュメントもあるのかな。

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 ~」の意味が無いですからね。

QhtmlまたはJavascriptからファイルを引数つきで起動する。

htmlまたはJavascriptからファイルを引数つきで起動する。

マクロ(macro.xls)に引数(csvファイル名)を渡して起動させたいため、
vbsを作成してマクロを引数つきで実行するようにしました。

コマンドからは
>test.vbs /FILE:macro.xls /P:aaa.csv

でマクロを実行することができたのですが、

HTMLにリンクを張り、リンクをクリックすることで
vbsを引数つきで実行するにはどうすればよいでしょうか?
(Javascriptを経由しても構いません)

Aベストアンサー

当然、Windows IE限定のお話ですよね。

どおしてもHTMLでやりたいなら、test.vbsなんて余計な物を作らずに、
直接javascript(MsのJscript)のActiveXオブジェクトを使って、
直接ExcelApplicationオブジェクトを作って、Excelオブジェクト
のクラスメソッドを使って、ファイルの読み込み、マクロの実行を
すればよいんじゃないかと、Excelオブジェクトをシームレスで動かせば、
Excelを見せなくして、マクロ実行だけこっそりさせる事も出来ます。

※だから、セキュリティ制限が厳しいのです。IEで、信頼済みサイトに登録する
必要があります。


<body>
----------
<p>
<a name="button_no_kawari" onclick="Excel_open('xxx.xls');return false;">
エクセルを実行</a>
</p>
----------
<script type="text/javascript">
<!--
 function Excel_open(pgm_name){
  var pgm_path = "c:/プログラム/";
  var file_name = pgm_path + pgm_name;
  var Excel = new ActiveXObject("Excel.Application");
  Excel.Visible = true;
  Excel.Workbooks.Open(file_name,0,"true"); 
  Excel.Workbooks(pgm_name).Sheets("Menu").Activate;
 //他にもいろいろExcelを操作出来る
  Excel.Application.Run("main"); //<=マクロ"main"実行
  Excel = "";
 }
// -->
</script>
</body>

当然、Windows IE限定のお話ですよね。

どおしてもHTMLでやりたいなら、test.vbsなんて余計な物を作らずに、
直接javascript(MsのJscript)のActiveXオブジェクトを使って、
直接ExcelApplicationオブジェクトを作って、Excelオブジェクト
のクラスメソッドを使って、ファイルの読み込み、マクロの実行を
すればよいんじゃないかと、Excelオブジェクトをシームレスで動かせば、
Excelを見せなくして、マクロ実行だけこっそりさせる事も出来ます。

※だから、セキュリティ制限が厳しいのです。IEで、信頼済みサイト...続きを読む

QPL/SQLのCREATE文でCHAR型で項目ができない

PL/SQLで以下のようにCREATE文を発行しました。
Bテーブルの項目 項目1,'1'を持つテーブルを作成したいのです。

DECLARE
 KBN CHAR(1);
 WK_SQL VARCHAR2(4000);
BEGIN
 KBN := '1';
 WK_SQL := 'CREATE TABLE A_TBL AS
   SELECT B.項目1 , ' || KBN || ' AS A項目
   FROM B_TBL B ' ;
 EXECUTE IMMEDIATE WK_SQL;
END;

結果はA_TBLの項目、A項目がどうしてもNUMBER型になるのです。初心者で、質問に不備なところもあるかもしれませんが、どうすればよいか、ご教授ください。

Aベストアンサー

先の投稿で、正しいSQL文を書きましたが・・・

ご自分のプロシジャで組み立てたSQL文が、
どのように成っているか確認しましたか?
確認していないなら、まずは確認してください。

>KBN を CHAR型で宣言しているのですが、だめなのでしょうか?
変数KBNのデータ属性がどうであれ、動的SQLには、関係のないことです。
EXECUTE IMMEDIATE で指定する文字列(SQL文)が全てです。
例えば、KBN:='A';としたら、どんなSQL文が完成するんですか?

>「'1']をセットするにはどうすればよいのでしょうか?
文字定数としてのシングルコーティションは、2コ続けて書くことで、
1つのシングルコーティションとして解釈されます。
KBN:=''''; とすると、「'」を代入する意味合いとなります。

QJavaScriptの関数の引数省略について

JavaScriptの関数で、下記のような引数の省略はできるでしょうか?

【例】

function hoge(aaa, bbb){}

hoge(,"できるかな");←このような引数の省略はできるでしょうか?

--------------------

しらべてみると、引数が2つあった場合、後方の引数の省略はできることがわかりました。

【例】
hoge("できるかな");←この場合できます。


しかし、引数が2つあった場合、前方の引数省略の例は見つけることができませんでした。
前方の引数を省略することはできるのでしょうか?
よろしくお願いします。

Aベストアンサー

>hoge(,"できるかな");

そういう引数の省略をする言語もありますが、javascriptでは
文法上間違っているのでエラーで処理されます

どうしてもやりたいならnullでも与えてあげてください
(まぁ省略になっていないですが・・・)

hoge(null,"できるかな");

あとは姑息に無理やり配列で渡すなどすれば似たようなことは
できないことはないですが、あまりお勧めはできません。

<script>
function func(){
var a=arguments[0][0];
var b=arguments[0][1];
document.write("1st:"+a+"<br>");
document.write("2nd:"+b+"<br>");
}
func(["hoge","fuga"]);
func([,"piyo"]);
</script>

QPL/SQLによるCREATE TABLE後のINSERTができない

いつもお世話になっております。
次で、PL/SQLで自動的に表tbを作成し、日時を挿入することを試みています。

BEGIN
EXECUTE IMMEDIATE
'CREATE TABLE tb (t TIMESTAMP)';
INSERT INTO tb VALUES(SYSTIMESTAMP);
END;
/

実行すると、tbが作られていない旨のエラーになってしまいます。
INSERT部分がなければ、表tbは作成できます。
表を作成し、データを挿入するにはどのようにすればよろしいでしょうか。
何卒よろしくお願いいたします。

Aベストアンサー

PL/SQLのプログラムは実行する前に解析されます。

実行する前にはtbというテーブルが存在しないのでエラーになります。

# 動的SQLの'CREATE TABLE ...'はただの文字列です。

回避策は、

1. CREATE TABLEとINSERTを別々のプログラムにする。
2. INSERTも動的SQLにする。

# DDL文とDML文を同一のプログラムで使用するときは注意が必要です。

Qjavascriptに引数を渡す方法について

お世話になります、
javascriptに下記のように引数を渡して
表示したいのですがうまくいきません。
<script language="javascript">
function dispData(msg)
{
document.write(msg);
}
</script>

$a = "hoge";
echo "<a href='#' onclick='javascript:dispData($a)'>" . $a . "</a><br>";
とすると動作してくれません。
$aをシングルコートで囲っても同じです。
$a = "/hoge/";をやると/hoge/を表示されます。
コーディングの方法を教えて頂きたいのですが。
dispData()に引数を渡して処理を行いたいもので。
よろしくお願い致します。

Aベストアンサー

document.writeする意味がわかりませんが・・・
きちんとクォーテーションをつけてやればわたりませんんか?

<script language="javascript">
function dispData(msg){
alert(msg);
}
</script>
<?
$a = "hoge";
echo "<a href='#' onclick='javascript:dispData(\"$a\")'>" . $a . "</a><br>";
?>

QPL/SQL内の共通関数の引数にフェッチしたレコードごと渡すのは可能?

カーソルでレコードを検索し、フェッチします。
その後、INSERTする共通関数を呼ぶのですが、
フェッチしたレコードの値でINSERTしたいのです。
引数で1コずつ渡すと数が多いので、フェッチしたレコードごと引数で渡せないかと
それって可能ですか?

Aベストアンサー

こんにちは。

 共通関数の引数にカーソルのレコード型(cursor_name%ROWTYPE)を
使用すればよいと思います。
ただこの場合は、汎用性に乏しいのですが・・・。

 よって個人的にはINSERT先のテーブル名のレコード型が
お勧めです。[テーブル名%ROWTYPE]
 カーソルのレコードから移し変える処理が必要になりますが、
登録処理が簡単に記述できますネ。
(INSERT INTO TAL_NAME VALUE record_type;)

Qjavascript外部読み込みの際の引数

教えてください。

HTML内で以下のように ?ver=12 と引数付きでjavascriptを読み込みます。
<script type="text/javascript" src="hoge.js?ver=12"></script>


このver=12をhoge.js内で利用するにはどうやって取得したらよいでしょうか?



※画像等のキャッシュの制御のためにバージョンナンバーをつけて管理します。

Aベストアンサー

一例です。

(function(){
var sc = document.getElementsByTagName("script");
var ver = sc[sc.length-1].src.match(/\?ver=(\d+)$/);
if(ver) ver = ver[1];
alert(ver);
})();

QSQL*PLUSでPL/SQLの実行

SQL*PLUSにて,
SQL>
となっているところに、別ファイルに記述してあるPL/SQLのコードを
丸々コピーして貼り付けると、
大体100行程度までコピーしたところで止まってしまいます。
止まった後、未コピー分を再びコピーし、
さらに100行程度進んだところでまた止まり、続きの分を再びコピーして貼り付ける…
として全てのプロシージャを貼り付け、そしてEXECUTEで実行して
デバッグしているのですが、

別ファイルに書いてあるPL/SQLコードを1度に登録する方法は
ないのでしょうか?
SQL*PLUSのウィンドウのオプション→環境の画面バッファの値を
いじってみたのですが何も変わりません。

どなたかいい方法をご存知ないでしょうか?

Aベストアンサー

PL/SQLのコードを書いたファイルを「hoge.sql」とかって保存して。
SQL>@c:?hoge.sql
とかっていうようにして実行。

コレでどうです?


人気Q&Aランキング

おすすめ情報