【问题标题】:JOINING table in oracle SQLoracle SQL中的JOINING表
【发布时间】:2014-04-30 02:27:56
【问题描述】:

我在尝试在 oracle 中加入两个表并显示值时遇到问题。

我的代码如下所示:

 if ($_POST['action'] == 'show'){
        
        $requestCompSql = "SELECT REQUEST_COMPONENT_CUTTING.PROJECT_NAME, 
                                  REQUEST_COMPONENT_CUTTING.BASE_PLATE, 
                                  REQUEST_COMPONENT_CUTTING.THICKNESS, 
                                    COMPONENT.CUTTING.QTY_REQUIRED,
                                  REQUEST_COMPONENT_CUTTING.QTY_REQUESTED
                                  REQUEST_COMPONENT_CUTTING.REQUESTER, 
                                  REQUEST_COMPONENT_CUTTING.REQUEST_DATE 
                                        FROM REQUEST_COMPONENT_CUTTING
                                        INNER JOIN COMPONENT_CUTTING
                                  ON REQUEST_COMPONENT_CUTTING.PROJECT_NAME = COMPONENT_CUTTING.PROJECT_NAME
                                    AND REQUEST_COMPONENT_CUTTING.THICKNESS = COMPONENT_CUTTING.THICKNESS
                                    AND REQUEST_COMPONENT_CUTTING.BASE_PLATE = COMPONENT_CUTTING.BASE_PLATE = '{$_POST["bp"]}'";

        $requestCompParse = oci_parse($conn, $requestCompSql);

        oci_execute($requestCompParse);

        while($row = oci_fetch_assoc($requestCompParse)){
        
        echo "<div class='table-responsive'>";
        echo "<table class='table table-bordered'>";
                                echo '<table cellspacing = "0"';
                                    echo '<thead>';
                                    echo '<tr>
                                              <th>PROJECT</th>
                                              <th>BASEPLATE</th>
                                              <th>THICK</th>
                                              <th>QTY REQUESTED</th>
                                              <th>QTY REQUIRED</th>
                                              <th>REQUESTER</th>
                                              <th>REQ. DATE</th>
                                              <th align="center">ACTION</th>  
                                          </tr>
                                          </thead>';

                                     echo "<tbody>";
                                        echo "<tr class='warning'><td>$row[PROJECT_NAME]</td>";
                                        echo "<td>$row[BASE_PLATE]</td>";
                                        echo "<td>$row[THICKNESS]</td>";
                                        echo "<td>$row[QTY_REQUESTED]</td>";
                                        echo "<td>$row[QTY_REQUIRED]</td>";
                                        echo "<td>$row[REQUESTER]</td>";
                                        echo "<td>$row[REQUEST_DATE]</td>";
                                        echo "<td><input type='button' value='OK' class='btn btn-success'>
                                            <input type='button' value='REJECT' class='btn btn-danger'></td>";

                                        echo "</tr>";
                                     echo "</tbody>";
                                 echo "<table cellspacing = '0'";
                                 echo "</div>";
        }

    }

给出的错误信息是这样的:

警告:oci_execute(): ORA-00923: FROM 关键字未在 C:\xampp\htdocs\WeltesInformationCenter\Component_approval\show_requested_component.php 第 60 行的预期位置找到

警告:oci_fetch_assoc(): ORA-24374: define not done before fetch or execute and fetch in C:\xampp\htdocs\WeltesInformationCenter\Component_approval\show_requested_component.php on line 62

我对此感到非常沮丧,因为QTY_REQUIRED 的值必须基于PROJECT_NAMETHICKNESSBASE_PLATE

【问题讨论】:

    标签: php sql oracle


    【解决方案1】:

    where 子句的最后一行是:

    AND REQUEST_COMPONENT_CUTTING.BASE_PLATE = COMPONENT_CUTTING.BASE_PLATE = '{$_POST["bp"]}'
    

    你应该把它分成两个不同的条件:

    AND REQUEST_COMPONENT_CUTTING.BASE_PLATE = COMPONENT_CUTTING.BASE_PLATE
    AND COMPONENT_CUTTING.BASE_PLATE = '{$_POST["bp"]}'
    

    另外,select 中缺少逗号,需要用下划线替换句点:

                           SELECT REQUEST_COMPONENT_CUTTING.PROJECT_NAME, 
                                  REQUEST_COMPONENT_CUTTING.BASE_PLATE, 
                                  REQUEST_COMPONENT_CUTTING.THICKNESS, 
                                    COMPONENT_CUTTING.QTY_REQUIRED,
    -----------------------------------------^
                                  REQUEST_COMPONENT_CUTTING.QTY_REQUESTED,
    ---------------------------------------------------------------------^
                                  REQUEST_COMPONENT_CUTTING.REQUESTER, 
                                  REQUEST_COMPONENT_CUTTING.REQUEST_DATE 
    

    【讨论】:

    • 还值得一提的是查看binding query variables,而不是将它们直接从$_POST 插入到您的查询字符串中,以保护您免受恶意攻击和副作用,例如SQL Injection。保护您的数据库交互的非常简单的方法。
    • @Alex.Ritna 我知道这一点,但是当我得到这个工作时,我开始绑定一切:)
    • @GordonLinoff 仍然无法正常工作,警告:oci_execute(): ORA-00904: "COMPONENT"."CUTTING"."QTY_REQUIRED": C:\xampp\htdocs\WeltesInformationCenter\ 中的标识符无效第 61 行的 Component_approval\show_requested_component.php
    • @Chriskonz 那是因为COMPONENT.CUTTING.QTY_REQUIRED 在数据库中不作为对象存在。也许你的意思是把COMPONENT_CUTTING.QTY_REQUIRED(带下划线_)
    【解决方案2】:

    您忘记输入WHERE,缺少 1 个逗号和不规则的三向比较。试试这样:

     $requestCompSql = "SELECT REQUEST_COMPONENT_CUTTING.PROJECT_NAME, 
                                          REQUEST_COMPONENT_CUTTING.BASE_PLATE, 
                                          REQUEST_COMPONENT_CUTTING.THICKNESS, 
                                            COMPONENT.CUTTING.QTY_REQUIRED,
                                          REQUEST_COMPONENT_CUTTING.QTY_REQUESTED,
                                          REQUEST_COMPONENT_CUTTING.REQUESTER, 
                                          REQUEST_COMPONENT_CUTTING.REQUEST_DATE 
                                                FROM REQUEST_COMPONENT_CUTTING
                                                INNER JOIN COMPONENT_CUTTING
                                          ON REQUEST_COMPONENT_CUTTING.PROJECT_NAME = COMPONENT_CUTTING.PROJECT_NAME
                                            WHERE REQUEST_COMPONENT_CUTTING.THICKNESS = COMPONENT_CUTTING.THICKNESS
                                            AND REQUEST_COMPONENT_CUTTING.BASE_PLATE = COMPONENT_CUTTING.BASE_PLATE
                                            AND COMPONENT_CUTTING.BASE_PLATE = '{$_POST["bp"]}'";
    

    【讨论】:

    • 我是这样做的,但它也不起作用link
    【解决方案3】:

    您好,我在您的查询中发现了两个问题

    第 5 行后缺少 1,逗号 ','

    REQUEST_COMPONENT_CUTTING.QTY_REQUESTED REQUEST_COMPONENT_CUTTING.REQUESTER,

    2、最后一行没有正确实现条件

    AND REQUEST_COMPONENT_CUTTING.BASE_PLATE = COMPONENT_CUTTING.BASE_PLATE = '{$_POST["bp"]}'

    这可能是

    AND REQUEST_COMPONENT_CUTTING.BASE_PLATE = COMPONENT_CUTTING.BASE_PLATE AND COMPONENT_CUTTING.BASE_PLATE = '{$_POST["bp"]}'"

    以上只是猜测,您可以根据自己的要求进行更正。

    【讨论】:

    • 我认为引号也可能有问题 = '{$_POST["bp"]}'" 将其更改为 = ' " 。 {$_POST["bp"]} 。 "'";
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2016-02-09
    • 2021-05-13
    • 2021-02-08
    相关资源
    最近更新 更多