1

v$session@remotedatabaseremotedatabaseがdblinkアドレスの変数である場合に実行したいと思い ます。それは可能ですか?

Apex 4を使用していて、すべてのデータベースで一時スペースを取得しようとしています。

現在のクエリ

select 'Total temp space available in :Database is '||sum(bytes)/1024/1024 ||' mb' from v$tempfile@:Database

変数が正しく解決されていないためにyeilds ORA-01729: database link name expected

私はSQLにまったく慣れていません、ごめんなさい

4

1 に答える 1

1

データベースリンクを可変にするには、動的SQLを使用する必要があります。PL / SQLでは、次のようになります。

DECLARE
  l_sql_stmt varchar2(1000);
  l_tmp_space varchar2(1000);
  l_database  varchar2(100) := <<db link name>>;
BEGIN
  l_sql_stmt := 'select ''Total temp space available in ' ||l_database  || ' is '' || sum(bytes)/1024/1024 ||'' mb'' from v$tempfile@' || l_database;
  dbms_output.put_line( l_sql_stmt );
  EXECUTE IMMEDIATE l_sql_stmt
    INTO l_tmp_space;
  dbms_output.put_line( l_tmp_space );
END;

基本的に、SQLステートメントを含む文字列を作成してから、動的に生成された文字列を実行する必要があります(SQLステートメント自体がここにあるように文字列を構築している場合は、より複雑になります。これにより、どの一重引用符をエスケープするかがわかります。ちょっとした挑戦)。

ただし、APEXで何をしようとしているのかによっては、少し違うものが必要になる場合があります。たとえば、これに基づいてレポートを作成しようとしている場合、SQLステートメントまたはSQLステートメントを返す関数のいずれかから通常の(非対話型)レポートを作成できます。それがあなたがやろうとしていることなら、あなたは次のようなものが欲しいでしょう

DECLARE
  l_sql_stmt varchar2(1000);
  l_tmp_space varchar2(1000);
  l_database  varchar2(100) := <<db link name>>;
BEGIN
  l_sql_stmt := 'select ''Total temp space available in ' ||l_database  || ' is '' || sum(bytes)/1024/1024 ||'' mb'' from v$tempfile@' || l_database;
  dbms_output.put_line( l_sql_stmt );
  RETURN l_sql_stmt;
END;
于 2012-06-01T16:20:06.050 に答える