无法选择 *(ORA-00932:不一致的数据类型:预期的 CHAR 得到了 ADT)

Cap*_*Ron 5 php sql oracle select geospatial

更新更新: 我可以通过定义列名来查询......所以问题出在查询上, SELECT *但我的表中有近100列......我不想将它们全部硬核并维护该列表......为什么可以我用不SELECT *??


我只是想创建一个按钮;前端,用户可以在其中选择三个表中的一个导出为 .csv 文件。单击一个选项 -> 该选项将通过该选项传回我的 PHP,table:which;然后将在 oracle 数据库中查询特定表并在浏览器中下载该表。以下是我返回错误的尝试。


jQuery前端调用(导出按钮点击):

$('#export' + '.' + crnt).click(function(){
      let which = crnt;
      window.location.href = "export?table="+which;
});
Run Code Online (Sandbox Code Playgroud)

PHP 通过纤薄的路线:

<?php
    
$app->post('/export', function ($request, $response, $args) {    

    $which = $_POST['table'];
    
    $config = parse_ini_file(__DIR__ . '/../../xx/xx.ini');
    $dbuser = $config['dbuser'];
    $dbpass = $config['dbpass'];
    $dbhost = $config['dbhost'];
    $dbname = $config['dbname'];
    $constr = $dbhost.'/'.$dbname;
    $conn = oci_pconnect($dbuser, $dbpass, $constr, 'XXX');

    if ($which == 'table_1'){
        $sql = 'SELECT * FROM app.table_1';
        $columnsql = 'SELECT column_name FROM app.table_1';
    } else if ($which == 'table_2'){
        $sql = 'SELECT * FROM app.table_2';
        $columnsql = 'SELECT column_name FROM app.table_2';
    } else if ($which == 'table_3'){
        $sql = 'SELECT * FROM app.table_3';
        $columnsql = 'SELECT column_name FROM app.table_3';
    }

    $stmt = oci_parse($conn, $sql); 
    $columnstmt = oci_parse($conn, $columnsql); 
    oci_execute($stmt);
    oci_execute($columnstmt);

    $columnnames = oci_fetch_array($columnstmt, OCI_ASSOC);
    $output = fopen("php://output", "w");
    fputcsv($output, $columnnames);

    while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
        fputcsv($output, $row);
    }

    fclose($output);

    header("Content-Type: text/csv; charset=utf-8");
    header("Content-Disposition: attachment; filename=$which.csv");
    
    if (!@oci_execute($stmt)) {
       $error = oci_error($stmt);
       throw new Exception($error['message']);
    }

    if (!@oci_execute($columnstmt)) {
       $error = oci_error($columnstmt);
       throw new Exception($error['message']);
    }

});
Run Code Online (Sandbox Code Playgroud)

错误 500:以上在我的开发工具网络控制台 -> 预览响应选项卡中返回以下错误:

在此处输入图片说明

在此处输入图片说明


更新:

我现在已经将所有post实例更新为 ->get哪个固定的post 方法不允许消息,但我仍然收到ORA inconsistent datatypes error......这与我headers在 php 中的内容有关吗?我把它们包括在哪里?我是否还需要在ajax调用中指定数据类型?我如何处理潜在的*ADT*数据类型?

小智 -2

您可以通过获取列名并将其全部转换为创建的查询中的文本字符串(甚至可以将文本转换为文本)来动态创建查询。 https://learn.microsoft.com/en-us/sql/t-sql/spatial-geometry/tostring-geometry-data-type?view=sql-server-ver15

您要将列名称放在第一个 CSV 行中吗?