如何从 Javascript 函数中调用 PL/SQL 变量?

Posted

技术标签:

【中文标题】如何从 Javascript 函数中调用 PL/SQL 变量?【英文标题】:How do I call PL/SQL variables from within a Javascript function? 【发布时间】:2015-12-30 17:57:56 【问题描述】:

我想通过从 javascript 函数中调用 pl/sql 变量来显示坐标 - 从 Oracle 数据库中检索 - 作为 Google 地图上的标记。这一切都在 APEX 5 中完成。任何帮助将不胜感激!

什么有效:我在PHOTO 表中选择GEOMETRY (SDO_GEOMETRY) 到l_lng(经度)和l_lat(纬度)变量中:

SELECT t.x Longitude,
  t.y Latitude
FROM photo,
  TABLE(sdo_util.getvertices(photo.geometry)) t;

使用DBMS_OUTPUT.put_line(l_lng);DBMS_OUTPUT.put_line(l_lat);,我可以看到l_lngl_lat成功存储了值,因为输出是:

-4.083714
50.315475

具体来说,javascript变量myLatLng需要从l_lngl_lat拉取坐标。

var myLatLng = lat: l_lat, lng: l_lng;

我的完整代码:

DECLARE

l_lng NUMBER;
l_lat NUMBER;


begin

SELECT t.x Longitude,
  t.y Latitude 
  INTO l_lng, l_lat
FROM photo,
  TABLE(sdo_util.getvertices(photo.geometry)) t
  WHERE photo.id=39;


htp.print('

<html>

<head>
    <style>
        #map 
            width: 500px;
            height: 400px;
        
    </style>
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <script>
        function initialize() 

                var myLatLng = 
                    lat: l_lat,
                    lng: l_lng
                ;



                var map = new google.maps.Map(document.getElementById("map"), 
                    zoom: 17,
                    center: myLatLng
                );
                var marker = new google.maps.Marker(
                    position: myLatLng,
                    map: map,
                    title: 'Hello World!'
               );
        



    </script>

</head>

<body>
    <div id="map"></div>
</body>

</html>

');
end;

按照@vmachan 的建议,我将 ht.print 语句修改为:

htp.print('<html>');
htp.print('<head>');
htp.print('<style>
    #map 
        width: 500px;
        height: 400px;
        
    </style>
');

htp.print('<INPUT TYPE="hidden" NAME="p_lng" VALUE="'||l_lng||'">');
htp.print('<INPUT TYPE="hidden" NAME="p_lat" VALUE="'||l_lat||'">');
htp.print(' 

    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <script>
        function initialize() 

                var myLatLng = 
                    lat: p_lat,
                    lng: p_lng
                ;



                var map = new google.maps.Map(document.getElementById("map"), 
                    zoom: 17,
                    center: myLatLng
                );
        
    </script>
');
htp.print('</head>');
htp.print('
    <body>
        <div id="map"></div>
    </body>
');
htp.print('</html>');

【问题讨论】:

我认为您需要将 htp.print 语句分解为多个,然后将 lat、long 值连接到您的 HTML。这个example 应该可以帮助你,滚动到 instruct_personal_info PROCEDURE.. 看看它在那个例子中是如何完成的 谢谢,我正在阅读 - 到目前为止看起来很有帮助! @vmachan 我使用了你的链接 - 我相信我做对了(代码验证,如果我将输入类型更改为 text,它会在页面上打印正确的坐标),但是虽然地图不显示。如果我像这样将坐标硬编码为myLatLng,它会起作用:var myLatLng = lng: -4.083714, lat: 50.315475 ; 表明 javascript 没有获取值!我会将我的 htp.print 语句添加到我的问题中。 您正在输出文本输入元素中的值,而不是作为 javascript 变量。要么编写代码将输入元素中的值提取到 javascript 变量中,要么将其作为 javascript 输出。 【参考方案1】:

以下是我认为如果应用会起作用的 sn-p,这就是我之前在评论中试图提出的建议。

htp.print('<script src="https://maps.googleapis.com/maps/api/js"></script>
<script>
    function initialize() 

            var myLatLng = 
                lat: ' || l_lng || ',
                lng: ' || l_lat || '
            ;

            var map = new google.maps.Map(document.getElementById("map"), 
                zoom: 17,
                center: myLatLng
            );
    
</script>');

在发送到 htp.print 时,您需要在多行上处理字符串延续,或者只是将整个 html 连接到一行中,这样可以工作但可能不太可读。

希望这会有所帮助。

【讨论】:

确实有帮助,谢谢!做相反的事情是一项简单的任务吗?在我的应用程序的另一部分,我使用 Google's Geolocation 获取当前位置,我需要获取这些坐标并将它们分配给我的应用程序中的项目。 您的意思是从 Javascript 中获取项目并将其发送到数据库?您的评论不清楚,您能详细说明一下吗? 假设这是最好的方法,从 JavaScript 获取 lat 和 lng 坐标并将它们分配给 PL/SQL 变量,这些变量又可以用于设置应用程序中文本字段的值。 我认为通常可行的一种方法是调用存储过程或 SQL 语句并将 Javascript 值作为参数发送给它,然后让 SQL 更新可以由您的其他部分使用的基础表应用程序。 谢谢,我会试一试。【参考方案2】:

您在文本输入元素中输出值,而不是作为 javascript 变量。要么编写代码以将输入元素中的值提取到 javascript 变量中,要么将其作为 javascript 输出。替换:

htp.print('<INPUT TYPE="hidden" NAME="p_lng" VALUE="'||l_lng||'">');
htp.print('<INPUT TYPE="hidden" NAME="p_lat" VALUE="'||l_lat||'">');

htp.print('var p_lng='||l_lng||';');
htp.print('var p_lat='||l_lat||''');

【讨论】:

以上是关于如何从 Javascript 函数中调用 PL/SQL 变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Javascript 函数中调用 PL/SQL 变量?

如何知道何时从控制台调用 JavaScript 函数? [复制]

sencha / javascript - 如何从 tpl 模板中调用函数

如何从java调用javascript函数?

页面如何从使用 Require() 的 javascript 文件中调用函数?

如何从 PyQT 调用 javascript 函数