簡體   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