数据库链接名称的变量

时间:2012-06-01 15:54:44

标签: sql database variable-assignment oracle-apex database-link

我想做v$session@remotedatabase其中remotedatabase是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很新,抱歉

1 个答案:

答案 0 :(得分: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;