从表中选择值,其中名称存储在另一个表中

时间:2017-12-18 08:58:10

标签: plsql oracle11g

我在下面的视图中使用var settings = new JsonSerializerSettings() { Converters = new List<JsonConverter> { new DataMapperListConverter() }, Formatting = Formatting.Indented }; 函数来检索从NODE表中作为输入提供的一些值。

get_rationalized_ip_adr

我必须在select stmt中添加该函数,以便获取其他表中存在的ipaddresses,这些表的名称存储在 CREATE OR REPLACE VIEW A_DEVICE AS SELECT NODE.NAME AS DEVICE , NODETYPE.TABLENAME AS TABLENAME , ext_a_device.get_rationalized_ip_adr(NODE.NODEID) AS IPADDRESS , COALESCE(LOC_SITE.OS_EASTING, LOC_RAILWAY.OS_EASTING, LOC_SIGNALBOX.EASTING) AS OS_EASTING , COALESCE(LOC_SITE.OS_NORTHING, LOC_RAILWAY.OS_NORTHING, LOC_SIGNALBOX.NORTHING) AS OS_NORTHING FROM NODE NODE JOIN NODETYPE NODETYPE ON NODE.NODE2NODETYPE = NODETYPE.NODETYPEID; 表中。

例如,这是一个截屏形式的nodetype表。因此,NODETYPE会调用一个API,该API会针对传递给它的每个nodeid从get_rationalized_ip_adr获取。

enter image description here

NR_NODE_DDF函数只使用nodeid输入调用API并返回相应节点的ip_adr。

get_rationalized_ip_adr

现在问题就是这个select语句需要大约90秒,这太过分了。

FUNCTION get_rationalized_ip_adr( pin_node_id IN NUMBER)

RETURN VARCHAR2 IS
ln_errorcode NUMBER;
ls_errortext VARCHAR2(200);
ls_result    VARCHAR2(200);
BEGIN
    pkggeneral.getobjectattribute( o_errorcode => ln_errorcode
                                        , o_errortext => ls_errortext
                                        , i_dimobject => pkgdimensionconstants.dimensionObject_Node
                                        , i_objectid  => pin_node_id
                                        , i_attribute => 'IP_ADDRESS'
                                        , o_result    => ls_result);
    RETURN ls_result;
END get_rationalized_ip_adr;

据我所知,在sql和pl-sql上下文之间切换是这次运行的问题。

有人能想到另一种减少这个时间的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您需要使用存储IP地址的表替换函数调用。

CREATE OR REPLACE VIEW A_DEVICE AS
    SELECT  NODE.NAME AS DEVICE
          , NODETYPE.TABLENAME AS TABLENAME
          , t.IPADDRESS
          , COALESCE(LOC_SITE.OS_EASTING, LOC_RAILWAY.OS_EASTING, LOC_SIGNALBOX.EASTING) AS OS_EASTING
          , COALESCE(LOC_SITE.OS_NORTHING, LOC_RAILWAY.OS_NORTHING, LOC_SIGNALBOX.NORTHING) AS OS_NORTHING
    FROM NODE NODE
    JOIN NODETYPE NODETYPE
         ON NODE.NODE2NODETYPE = NODETYPE.NODETYPEID
    join table_with_ip_address t
         on ...;

此外,请确保您在用于加入的字段上有必需的索引。

相关问题