我在下面的视图中使用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
获取。
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上下文之间切换是这次运行的问题。
有人能想到另一种减少这个时间的解决方案吗?
答案 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 ...;
此外,请确保您在用于加入的字段上有必需的索引。