繁体   English   中英

创建触发器时的语法错误

[英]Syntax errors when creating triggers

我知道这个问题已经以各种形式抛出了这里,但是我已经遍历了所有问题,却无法解决我的问题。 我不明白为什么我在此脚本上不断收到此语言错误。 我已经通过在这里看到的两个不同的示例来进行处理,但似乎不断给我带来相同的错误。 我真的很难让此触发功能起作用,请在这里感谢PostgreSQL专家的任何积极帮助。

   <?php
      include ("connection.php");
    $query = 'select * from fieldtally order by pipeno asc'; 
$result = pg_query($db_handle,$query); 
while ($row = pg_fetch_row($result))
{
    // Creates Arrays to use in dropdowns
    $pipeno_array[] = $row[0];
   } 
 // This function creates dropdowns that can be used in your forms
function dropdown($field_name, $num){
    // Creates the Dropdown
    echo "<select name=\"".$field_name."\" id=\"".$field_name.$num."\"\n";
    echo "<option value=\"\"> --- Select --- </option>\n";
    // Chooses which array to use for Dropdown options
   global $pipeno_array;
     $name_array = ($field_name == 'pipeno') ? $pipeno_array : $wthick;
    // Creates the Dropdown options based off the array above
    foreach($name_array as $k){
        echo "<option value=\"$k\">$k</option> \n"; }
    // Ends the Dropdown
    echo "</select>\n";
}
?>

<html>
<head><title>UG Pipeline Fiedl Data Capture</title></head>
<body>
<form action="fieldtally.php" method="post">
<table width="800" cellpadding= "10" cellspacing="1" border="1">
<tr align="center" align="top">
<td align="center" colspan="1" rowspan="1" bgcolor="#64b1ff">
<h3>Input Field Tally Information</h3>
Select Wall Thickness:<select name="wthick" id="wthick">
   <option value=""> --Select-- </option> 
  <option value="9.80">  9.80  </option>
  <option value="13.50"> 13.50 </option>
  <option value="15.90"> 15.90 </option>
  </Select> 
Select Pipe No:<?php dropdown('pipeno', 1); ?>   Select Pipe Manufacturer:<select name="manufacturer" id="manufacturer">
 <!-- #7.1 -->
  <option value=""> --Select-- </option> 
  <option value="KWH Pipe">KWH Pipe </option>
  <option value="Atlas Tube">Atlas Tube</option>
  <option value="Imperial Steel">Imperial Steel</option>
  <option value="Lakeside">Lakeside</option>
  <option value="Spiralco">Spiralco</option>
  <option value="Muri metals">Muri metals</option>
  <option value="WestLake">WestLake</option>
  <option value="Westman Steel">Westman Steel</option>
     <option value="Lockerbie & Hole">Lockerbie & Hole</option>
      <option value="Nardei">Nardei</option>
  </Select><br /><br />  
Joint No: <input type="text" name="djointno"> Input measured Length: <input type="text" name="measuredlength"><br><br>
Input Serial No: <input type="text" name="serialno"><br><br> 
<input type="Submit" name="submit" value="Submit">
</td></tr></table></form><p></p>
</form>
</body>
</html>

字段tally.php脚本如下所示

<?php
 $PGHOST = "localhost:25376";
 $PGDATABASE = "Pipeline";
 $PGUSER = "postgres";
 $PGPASSWORD = "Casa2009";
 $PGPORT = 5432;
 $db_handle = pg_connect("dbname=$PGDATABASE user=$PGUSER
 password=$PGPASSWORD");
 if ($db_handle) {
 echo 'Connection attempt succeeded.';
 } else {
 echo 'Connection attempt failed.';
 }
 $pipeno = pg_escape_string( $_POST['pipeno']);  
 $wthick = pg_escape_string($_POST['wthick']);
 $djointno = pg_escape_string($_POST['djointno']);
 $manufacturer = pg_escape_string($_POST['manufacturer']);
 $measuredlength = pg_escape_string($_POST['measuredlength']);
 $serialno = pg_escape_string($_POST['serialno']); 
  $query = "CREATE FUNCTION upsert (sql_update TEXT, sql_insert TEXT)
                 RETURNS VOID
                 LANGUAGE plpgsql
            AS $$
            BEGIN
               LOOP
                  EXECUTE sql_update;
                  IF FOUND THEN
                     RETURN;
                  END IF;
                  BEGIN
                     EXECUTE sql_insert;
                     RETURN;
                     EXCEPTION WHEN unique_violation THEN
                  END;
              END LOOP;
            END;
            $$";

   $result = pg_query($query);
 if (!$result) {
 $errormessage = pg_last_error();
 $message = "Error with query: " . $errormessage;
 }
 $message = sprintf ("These values were inserted into the pipeline database - %s %s %s %s %s %s",$wthick,$pipeno,$manufacturer,$djointno,$measuredlength,$serialno);
 pg_close();
?>

这两个语句都是乱码。 您需要阅读PL / PgSQL触发器文档 ,包括那里给出的示例,以了解语法。

本质上,您首先:

CREATE OR REPLACE FUNCTION func_name() RETURNS trigger AS $$
BEGIN
   -- Trigger body here
END;
$$ LANGUAGE plpgsql;

然后在表格上使用该触发函数:

CREATE TRIGGER trigger_name
BEFORE INSERT OR UPDATE OR DELETE ON tablename
FOR EACH STATEMENT EXECUTE PROCEDURE func_name();

此外,代码中的触发器主体将永远无法工作。 PostgreSQL不支持ON DUPLICATE KEY UPDATE 那是一种MySQL主义。 您正在寻找像MERGEUPSERT这样的行为,不幸的是,在PostgreSQL中很难做到这一点。 看到这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM