PostgreSQL中pgScript的目的是什么?

时间:2013-04-16 08:28:39

标签: postgresql pgadmin

我无法理解pgScript的需要,可以使用pgAdmin工具执行。应该什么时候使用? plpgSQL不能做什么呢?什么是相同的Microsoft SQL Server?

3 个答案:

答案 0 :(得分:10)

pgScript是一种客户端脚本语言,而pl / PgSQL在服务器上运行。这意味着它们具有完全不同的用例。例如,PgScript可以管理事务状态,而pl / PgSQL则不能,但pl / Pgsql可用于扩展SQL的语言,而pgScript则不能这样做。

此外,这意味着两者将处理许多其他事情,从查询计划到动态SQL,而pgScript需要在查询之间往返,而pl / Pgsql不会。

答案 1 :(得分:2)

pgScript的一个用途是定义变量并在以后的SQL中使用它们。

例如,您可以执行以下操作:

package com.vcenter;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import com.vmware.vim25.VirtualMachineQuickStats;
import com.vmware.vim25.VirtualMachineSummary;
import com.vmware.vim25.mo.ClusterComputeResource;
import com.vmware.vim25.mo.Folder;
import com.vmware.vim25.mo.HostSystem;
import com.vmware.vim25.mo.InventoryNavigator;
import com.vmware.vim25.mo.ManagedEntity;
import com.vmware.vim25.mo.ServiceInstance;
import com.vmware.vim25.mo.VirtualMachine;

public class VCenterUtils {
 private ServiceInstance serviceInstance = null;

 public VCenterUtils(String url, String userName, String password) {
  try {
   serviceInstance = new ServiceInstance(new URL(url), userName, password, true);
  } catch (RemoteException e) {
   e.printStackTrace();
  } catch (MalformedURLException e) {
   e.printStackTrace();
  }
 }

 private ManagedEntity[] getClusters() {
  Folder rootFolder = null;
  ManagedEntity[] entities = null;
  rootFolder = serviceInstance.getRootFolder();
  try {
   entities = new InventoryNavigator(rootFolder).searchManagedEntities("ClusterComputeResource");
  } catch (RemoteException e) {
   e.printStackTrace();
  }
  return entities;
 }

 public List findVirtualMachines() {
  List machineDTOs = new ArrayList();
  ManagedEntity[] entities = getClusters();
  ClusterComputeResource cluster = null;
  if (entities.length > 0) {
   for (ManagedEntity entity : entities) {
    cluster = (ClusterComputeResource) entity;
    HostSystem[] hosts = cluster.getHosts();
    for(HostSystem host : hosts) {
     VirtualMachine[] vms;
     try {
      vms = host.getVms();
      for(VirtualMachine vm : vms) { 
       VirtualMachineDTO machineDTO = new VirtualMachineDTO();
       machineDTO.setName(vm.getName());
       machineDTO.setStatus(vm.getOverallStatus().name());
       machineDTO.setState(vm.getSummary().getRuntime().getPowerState().name());

       VirtualMachineSummary summary = vm.getSummary();
       Double comittedSpace = Double.valueOf(summary.getStorage().getUncommitted())/1024/1024/1024;
       Double uncomittedSpace = Double.valueOf(summary.getStorage().getUncommitted())/1024/1024/1024;
       //calculating Provisioned Space of a virtual machine
       Double provisionedSpace = comittedSpace + uncomittedSpace;
       machineDTO.setProvisionedSpace(provisionedSpace);
       machineDTO.setUsedSpace(comittedSpace);

       VirtualMachineQuickStats virtualMachineQuickStats =summary.getQuickStats();
       machineDTO.setHostCpu(virtualMachineQuickStats.getOverallCpuUsage());
       machineDTO.setHostMemory(virtualMachineQuickStats.getHostMemoryUsage()); 
       machineDTOs.add(machineDTO);
      }
     } catch (RemoteException e) {
      e.printStackTrace();
     }
    }
   }
  }
  return machineDTOs;
 }
}

这种方法只是让您想要在脚本顶部更改任何变量,而不是深入到复杂SQL查询中的那些变量。

当然,pgScript是一个仅在PgAdmin III客户端内可用的功能,例如在他的评论中提到的@ {Craig Ringer}。

答案 2 :(得分:-1)

我使用了Toad Data Modeler的DDL脚本生成器。

我在PgAdmin-III中使用普通查询执行来运行脚本,但它一直给我错误:
“错误:关系”用户“已存在SQL状态:42P07”

我在 PgAdmin-III 中运行了Execute pgScript,它运行正常。